情况
我使用带有自己的 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 …
在开发模式下,我可以通过将单个资产文件放入[my_app]/app/assets
文件夹,例如:
[my_app]/app/assets/javascripts/gem_name/backoffice/menu.js
Rails 中配置的加载路径确保文件位于[my_app]/app/assets
覆盖文件[gem]/app/assets
.
But 当我使用预编译资产时rake assets:precompile
,覆盖文件menu.js
不会替换 gem 中的原始文件。编译出来的application.js
包含原始代码menu.js
.
Demo
查看此测试应用程序的实际行为:https://github.com/widescape/AssetCompileTest https://github.com/widescape/AssetCompileTest
注意事项
到目前为止,我发现require_tree
查找文件only在当前文件的目录中并且执行not查看多个加载路径(例如应用程序/资产或供应商/资产)。所以如果当前文件是[gem]/app/assets/javascripts/gem_name/application.js
, Sprockets#require_tree
只会查看[gem]/app/assets/javascripts/gem_name/
获取更多文件并将not使用其他加载路径,例如[my_app]/app/assets/…
.
我不愿意将所有资产文件从 gem 复制到我的应用程序/资产中,只是为了覆盖一个文件。并且分叉 gem 来定制单个文件也没有太大的吸引力。
还有其他办法吗?
Note:我知道我可以创建自定义 JavaScript 文件menu_patched.js
覆盖原始文件中定义的对象和方法并将其放置,以便在调用原始对象和方法之前应用其定义(猴子修补 JavaScript 风格)。但我在这里寻找更清洁的解决方案。