Мы пишем драгоценный камень, который включает в себя несколько общих драгоценных камней для пары наших общих приложений.Мы хотим иметь возможность иметь конфигурацию в application.rb
или enviroment.rb/*rb
что-то вроде config.fruit_chain.enable_transport = true
из приложения-потребителя, чтобы условно требовать гем и его динамический инициализатор.Но инициализатор из общего драгоценного камня не запускается после require в railtie.Я задавался вопросом, есть ли лучший способ сделать это
fruit_store / config / application.rb.(приложение потребления)
module FruitStore
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 5.2
config.fruit_chain.enable_transport = true
end
end
fruit_chain / lib / fruit_chain.rb (Наша жемчужина)
require analytic
- require transport <----- removed this so it dose not autoload
require marketing
...
module FruitChain
end
fruit_chain / lib / fruit_chain / rails / railtie.rb
module FruitChain
module Rails
class Railtie < ::Rails::Railtie
config.fruit_chain = ActiveSupport::OrderedOptions.new
config.fruit_chain.enable_transport = false
config.before_initialize do |app|
if app.config.fruit_chain.enable_transport
Kernel.require 'transport' <--- this require the gem correct and load it up
app.initializers.find{
|a| a.name === 'transport.configure'
}.run <--- transport.configure initializer doesn't kick off
end
end
end
end
end
transport / lib / transport.rb.(Зависимый общий камень)
require transport/rails/railtie
...
module Transport
end
transport / lib / transport / rails / railtie.rb
module Transport
module Rails
class Railtie < ::Rails::Railtie
initializer 'transport.configure' do |app|
...
end
end
end
end