如何从 gem 资产中覆盖单个文件来进行资产:预编译?

2024-02-18

情况

我使用带有自己的 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 风格)。但我在这里寻找更清洁的解决方案。


在您发布的演示代码中在 GitHub 上 https://github.com/widescape/AssetCompileTest,您的 application.js 有:

//= require any_gem

这不会引入目录,而是引入any_gem.js,这是 Gem 的清单文件,引入了allGem 的 JS 文件。如果你不想all文件的数量,那么您需要更改它,通过显式列出它们来仅引入您想要的文件:

//= require ../../../vendor/assets/javascripts/any_gem/do_not_override.js

然后,您可以添加回您自己的所有 JS 文件,包括您的覆盖:

//= require_tree .

顺便说一句,创建演示应用程序非常棒!你是孩子们的榜样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 gem 资产中覆盖单个文件来进行资产:预编译? 的相关文章

随机推荐