如何从GEM资产中覆盖来自GEM资产的单个文件:预编译?[英] How to override single files from gem assets for assets:precompile?

本文是小编为大家收集整理的关于如何从GEM资产中覆盖来自GEM资产的单个文件:预编译?的处理方法,想解了如何从GEM资产中覆盖来自GEM资产的单个文件:预编译?的问题怎么解决?如何从GEM资产中覆盖来自GEM资产的单个文件:预编译?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

情况

我使用一个带来自己的JavaScript和样式表资产的创业板.此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中配置的负载路径,然后确保[gem]/app/assets中的[my_app]/app/assets覆盖文件中的文件.

但当我使用rake assets:precompile预编译资产时,覆盖文件menu.js不会替换从gem 的原始文件.编译的application.js包含原始menu.js的代码.

演示

查看此测试应用程序中的行为: https://github.com/widescape/assetcompiletest

注意事项

到目前为止,我发现require_tree在当前文件目录中查找文件 ,并在多个负载路径上查看 not (例如,应用程序/资产或供应商/资产).因此,如果当前文件是[gem]/app/assets/javascripts/gem_name/application.js,则Sprockets#require_tree仅在[gem]/app/assets/javascripts/gem_name/中查看更多文件,并且将 NOT 使用其他负载路径,如[my_app]/app/assets/….

我不愿意将来自gem的所有资产文件复制到我的应用程序/资产中仅覆盖一个文件.并刻字创业板以定制单个文件也没有很大的吸引力.

有没有其他方式?

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

推荐答案

在演示代码中,您在上,您的application.js具有:

//= require any_gem

不会引入目录,它带来了any_gem.js,它是Gem>所有所有的GEM的清单文件.如果您不想要所有文件的,那么您需要更改它仅在显式列出它们时才携带所需的文件:

//= require ../../../vendor/assets/javascripts/any_gem/do_not_override.js
然后,您可以在所有自己的JS文件中添加,包括覆盖,其中:

//= require_tree .

btw,很棒的创建演示应用程序!你是孩子们的榜样.

其他推荐答案

在application.rb或production.rb中,您可以预先添加或附加更多资产路径.

config.assets.prepend_path 'vendor/assets/jquery'
config.assets.append_path 'vendor/assets/something'

参考:

本文地址:https://www.itbaoku.cn/post/786526.html