何时根据导轨加载Gem代码
我正在开发一个专门用于Rails项目的Gem。 它是在Rails应用程序的lib
目录内部开发的,现在将在一个单独的Gem中提取。
有些类依赖于要加载的Rails框架。 两个例子:
class OurGem::Hookup
CONFIG_PATH = 'config/hookup.rb'.freeze
[...]
end
class OurGem::RoutingContainer
include Rails.application.routes.url_helpers
[...]
end
通常,我使用require
在Gem的主模块文件中加载Gem代码。 但是,由于这是由bundler加载的,Rails还没有准备好, Rails.application
和Rails.root
等东西无法使用。 第一个例子可以通过在加载时不评估路径来解决,但第二个例子对我来说似乎有点棘手。
这样做的正确方法是什么? 使用railtie注册初始化程序并要求那里的“精巧”文件?
这是一个奇怪的设置,因为你的宝石取决于你的导轨应用程序,你的导轨应用程序取决于你的宝石。
这看起来太耦合了。 你有没有考虑创建一个自包含的导轨引擎,你的主要应用程序挂载,而不是?
不过,你也许能够做到这一点:
# Gemfile
gem 'our_gem', require: false
# config/initializers/our_gem.rb
require 'our_gem'
OurGem::Hookup.config_path = '...'
这可以确保你的gem只在rails应用程序初始化之后被加载 - 所以Rails.application.routes.url_helpers
这样的东西将被定义。