【问题标题】:Overriding backend assets in production environment在生产环境中覆盖后端资产
【发布时间】:2011-10-20 00:12:46
【问题描述】:

我正在做一个需要稍微改变 Refinery 的 WYMEditor 行为的项目。这很容易通过使用rake refinery:override 覆盖jquery.refinery.wymeditor.js 并根据我自己的需要进行编辑来完成,这在开发环境中运行良好。

但是,当涉及到生产时,会忽略覆盖。也就是说,编译后的资产只包含来自 bundle 的jquery.refinery.wymeditor.js,直接在那里编辑该文件可能会产生预期的效果,但这不是应该的方式。

奇怪的是,问题显然只有在尝试覆盖后端相关资产时才会显现出来。

知道我正在使用炼油厂边缘可能会很有用。

任何帮助表示赞赏。

【问题讨论】:

  • 您解决了这个问题吗?我有同样的问题。
  • 还没有,很遗憾。如果有任何细节出现,我会更新。
  • 我可能已经找到了解决方案。简而言之,问题是如果被覆盖的文件是通过 sprockets 的require 包含的,那么包含这个包含的文件以及它包含的所有其他文件也必须被覆盖。看看捆绑包中的/app/assets/javascripts/refinery/refinery.js。我将在今天晚些时候发布详细的答案。
  • 好吧,我想我已经完成了。 @Lilitu88,你的进展如何?
  • 我也发现了同样的问题。以丑陋的 hack 告终,而不是真正的修复。

标签: ruby-on-rails ruby-on-rails-3 assets sprockets refinerycms


【解决方案1】:

所以我成功地击败了它。首先要提到的是,如果不深入研究 Refinery 源代码,这是不可能的。

正如我已经在评论中写的那样,问题是我试图覆盖未包含在其中的资产(wymeditor/jquery.refinery.wymeditor.js)直接视图,但在另一个资产中引用,该资产取自 gem。而且由于 sprockets 对 Refinery 的覆盖一无所知,因此它也通过相对路径获取引用的资产,即来自 gem(因此,未修改)。所以,再一次,在我的情况下,解决方案是覆盖 refinery/wymeditor.js,一切都像一个魅力。

如果您需要更改除 WYMEditor 之外的任何其他后端脚本,您很可能必须覆盖 refinery/refinery.js,其中包括所有其他后端脚本,除了您的脚本需要修改。

不过,有一个大问题。通过所有这些覆盖,我所做的任何更新都非常容易出错,因为有些文件会更新,有些则不会。可以通过覆盖所有内容来避免这种情况,但这实际上意味着根本没有更新。

【讨论】:

    【解决方案2】:

    尝试更改生成文件的名称并将其包含在清单中,而不是原始名称。我怀疑它在存在两个命名相同的资产的情况下更喜欢原版。

    【讨论】:

    • 我们正在尝试覆盖另一个文件。如果我没记错的话,用这种方法你可以同时拥有它们。对吗?
    • 是的,如果您重命名生成的文件,您应该可以在生产环境中使用这两个文件。生成的文件是否包含所有 javascript?如果确实如此,则从清单中删除原始文件的名称,重命名生成的文件,将其包含在清单中,您应该一切顺利。顺便说一句,你在预编译你的资产吗?
    • 我已经尝试过预编译和即时编译,结果相同。今天将尝试您的解决方案,看看结果如何。