Rob*_*ert 12 gem assets ruby-on-rails sprockets
我使用带有自己的JavaScript和样式表资源的gem.此gem使用标准的application.js和application.css清单来要求其所有资产:
[gem]/app/assets/javascripts/gem_name/application.js
require_tree .
[gem]/app/assets/javascripts/gem_name/backoffice/menu.js
… some JavaScript code …
[gem]/app/assets/javascripts/gem_name/backoffice/forms.js
… some JavaScript code …
Run Code Online (Sandbox Code Playgroud)
在开发模式中,我可以通过将它们放在[my_app]/app/assets文件夹中来覆盖单个资产文件,例如:
[my_app]/app/assets/javascripts/gem_name/backoffice/menu.js
Run Code Online (Sandbox Code Playgroud)
然后在Rails中配置的加载路径确保[my_app]/app/assets覆盖文件中的文件[gem]/app/assets.
但是当我使用预编译资产时rake assets:precompile,覆盖文件menu.js不会替换gem中的原始文件.编译application.js包含原始代码menu.js.
请参阅此测试应用程序的行为:https://github.com/widescape/AssetCompileTest
到目前为止,我发现,require_tree查找文件,只在当前文件的目录,也没有跨多个负载路径(如应用程序/资产或供应商/资产)的样子.因此,如果当前文件是[gem]/app/assets/javascripts/gem_name/application.js,Sprockets#require_tree将只查找[gem]/app/assets/javascripts/gem_name/更多文件,不会使用其他加载路径,如[my_app]/app/assets/….
我不愿意将gem中的所有资产文件复制到我的app/assets中,以覆盖单个文件.并且分支宝石来定制单个文件也没有很大的吸引力.
还有其他方法吗?
注意:我知道我可以创建一个自定义JavaScript文件menu_patched.js来覆盖原始文件中定义的对象和方法,并将其放置,以便在调用原始对象和方法之前应用其定义(猴子修补JavaScript样式).但我在这里寻找一个更清洁的解决方案.
在GitHub上发布的演示代码中,您的application.js具有:
//= require any_gem
Run Code Online (Sandbox Code Playgroud)
它没有引入一个目录,它带来了any_gem.js,这是Gem的清单文件,它带来了所有 Gem的JS文件.如果您不想要所有文件,那么您需要通过明确列出它们来更改它以仅引入您想要的文件:
//= require ../../../vendor/assets/javascripts/any_gem/do_not_override.js
Run Code Online (Sandbox Code Playgroud)
然后,您可以添加回所有自己的JS文件,包括覆盖,包括:
//= require_tree .
Run Code Online (Sandbox Code Playgroud)
顺便说一下,创建演示应用程序非常棒!你是孩子们的榜样.