We are writing a gem that includes multiple common gems for a couple of our shared apps. We want to be able to have a config in application.rb
or enviroment.rb/*rb
something like config.fruit_chain.enable_transport = true
from the consuming app to conditionally require a gem and it's initializer dynamically. But the initializer from common gem does not run after require in a railtie. I wondered if there is a better way to do this
fruit_store/config/application.rb . (consuming app)
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 (Our gem)
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 . (Dependent common gem)
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