如何更改其中一个gem中加载gem的顺序

我有两个gem“CoreGem”和“AddonGem”。 Addon Gem增加了额外的function,将覆盖核心gem。

如何确保如果添加第二个gem,它将覆盖第一个gem的视图和资产。

到目前为止,它在添加到主应用程序时起作用:

config.railties_order = [ :main_app, AddonGem::Engine, :all] 

但我想从AddonGem中做到这一点。

谢谢

使用railties_order地方

railties_order在这里使用:

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L317

确定要运行的initializer块的顺序,

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L337

在其他gem中找到。

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L47

因此,在initializer块中设置railties_order将毫无意义,因为在调用initializer块时, railties_order已经设置并且正由应用程序的其余部分使用。

你可以做什么呢

显然, Rails::Application::Bootstrap有更多initializer块。

https://github.com/rails/rails/blob/master/railties/lib/rails/application/bootstrap.rb

这些是在主应用程序的初始化程序块之前添加的:

https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L262

那么也许你可以使用一些初始化器来修补Bootstrap模块? 我猜这是你的电话。

AddonGemAddonGem一个注入此代码的生成器

 config.railties_order = [ :main_app, AddonGem::Engine, :all] 

在主应用程序中,如addongem:install命令。

只是为了完成,虽然这是一个简单的方法。 应该可以在核心之后将插件挂钩。