gpt4 book ai didi

ruby-on-rails - 如何为 Assets :precompile? 覆盖 gem Assets 中的单个文件

转载 作者:行者123 更新时间:2023-12-04 01:02:37 25 4
gpt4 key购买 nike

情况

我使用了一个带有自己的 JavaScript 和样式表 Assets 的 gem。这个 gem 使用标准的 application.js 和 application.css list 来要求它的所有 Assets :

[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 …

在开发模式下,我可以通过将单个 Assets 文件放在 [my_app]/app/assets 中来覆盖它们。文件夹,例如:
[my_app]/app/assets/javascripts/gem_name/backoffice/menu.js

Rails 中配置的加载路径然后确保 [my_app]/app/assets 中的文件覆盖 [gem]/app/assets 中的文件.

但是 当我使用 rake assets:precompile 预编译 Assets 时,覆盖文件 menu.js不会替换 gem 中的原始文件 .已编译 application.js包含来自原始 menu.js 的代码.

演示

查看此测试应用程序的实际行为: https://github.com/widescape/AssetCompileTest

注意事项

到目前为止,我发现 require_tree仅在当前文件的目录中查找文件,而不查找多个加载路径(例如 app/assets 或 vendor/assets)。所以如果当前文件是 [gem]/app/assets/javascripts/gem_name/application.js , Sprockets#require_tree只会查看 [gem]/app/assets/javascripts/gem_name/用于更多文件,不会使用其他加载路径,如 [my_app]/app/assets/… .

我不愿意将 gem 中的所有 Assets 文件复制到我的应用程序/ Assets 中,只是为了覆盖一个文件。并且 fork gem 来自定义单个文件也没有很大的吸引力。

有没有其他办法?

注:我知道我可以创建自定义 JavaScript 文件 menu_patched.js覆盖原始文件中定义的对象和方法并将其放置,以便在调用原始对象和方法之前应用其定义(猴子修补 JavaScript 风格)。但我在这里寻找更清洁的解决方案。

最佳答案

在您发布于 on GitHub 的演示代码中,你的 application.js 有:

//= require any_gem

这不会引入目录,而是引入 any_gem.js ,这是 Gem 的 list 文件,它引入了 Gem 的所有 JS 文件。如果您不想要所有文件,那么您需要通过明确列出它们来更改它以仅引入您想要的文件:
//= require ../../../vendor/assets/javascripts/any_gem/do_not_override.js

然后您可以添加回您自己的所有 JS 文件,包括您的覆盖,使用:
//= require_tree .

顺便说一句,在创建演示应用程序方面做得很好!你是 children 的榜样。

关于ruby-on-rails - 如何为 Assets :precompile? 覆盖 gem Assets 中的单个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com