我有两个宝石“CoreGem”和“AddonGem”。Addon Gem 添加了将覆盖核心 gem 的额外功能。
我如何确保如果添加了第二个 gem,它将覆盖第一个 gem 的视图和资产。
到目前为止,它在添加到主应用程序时有效:
config.railties_order = [ :main_app, AddonGem::Engine, :all]
但我想从 AddonGem 中做到这一点。
谢谢
我有两个宝石“CoreGem”和“AddonGem”。Addon Gem 添加了将覆盖核心 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
在其他宝石中发现。
https://github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L47
因此,在块railties_order
内进行设置initializer
将毫无意义,因为在initializer
调用该块时,该块已railties_order
被设置并被应用程序的其余部分使用。
显然initializer
,在Rails::Application::Bootstrap
.
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 模块进行猴子补丁?我想这是你的电话。
制作一个AddonGem
注入此代码的生成器
config.railties_order = [ :main_app, AddonGem::Engine, :all]
在主应用程序中,就像一个addongem:install
命令。
只是为了完成,虽然这是一个简单的出路。应该可以在某处核心之后挂钩插件。