何时加载 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.applicationRails.root这样的东西无法使用。第一个示例可以通过在加载时不评估路径来解决,但第二个示例对我来说似乎有点棘手。

这样做的正确方法是什么?使用 railtie 注册初始值设定项并需要那里的"精致"文件?

这是一个奇怪的设置,因为您的 gem 依赖于您的 rails 应用程序,而您的 rails 应用程序则取决于您的 gem。

这看起来对我来说太耦合了。您是否考虑过创建一个独立的 rails 引擎来代替您的主应用程序挂载?

不过,您也许可以侥幸这样做:

# Gemfile
gem 'our_gem', require: false
# config/initializers/our_gem.rb
require 'our_gem'
OurGem::Hookup.config_path = '...'

这可确保仅在 rails 应用程序初始化加载 gem - 因此将定义诸如Rails.application.routes.url_helpers之类的内容。