我正在开发一个专门用于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 注册初始值设定项并需要那里的"精致"文件?
这是一个奇怪的设置,因为您的 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
之类的内容。