我在部署期间遇到了 Assets 预编译的问题,因此我选择进行本地预编译并将生成的文件 checkin 到我的源代码树中。我对这种方法没有任何问题, 除了 有时我忘记运行预编译任务并在没有预编译 Assets 的情况下发布! :(

我想知道是否有人遇到过某种方法来检查是否发生了任何 Assets 更改?理想情况下,我想在我的 CI 服务器上运行某种检查,如果有尚未提交的 Assets 更改,则构建失败。

我有几个想法:

  • 在 CI 服务器上运行 RAILS_ENV=production bundle exec rake assets:precompile 看看有没有输出。 (如果 Assets 是最新的,该命令似乎不会输出任何内容。)但是,似乎该命令的输出以某种方式与其运行的环境相关联,因为在本地运行该命令后,提交结果,然后在CI服务器上运行命令,还是有命令输出!我想知道为什么这与环境有关,但我什至无法在 rails github repo 中找到 rake assets:precompile 的来源。有谁知道它的来源在哪里?
  • 不知何故编写一个命令,可以查看 git 历史记录并确定自上次预编译以来我的 assets/ 文件夹中是否有任何 Assets 发生了变化。不太确定这将如何工作...

  • 这让我咬了好几次,有时当同事提交 Assets 更改时我没有发现它 - 而且看起来这真的是计算机应该能够为人类捕获的东西。我想一个有点合理的第三种选择是让 CI 服务器简单地运行命令,并自动将生成的文件提交到源树,但我不喜欢我的 CI 服务器进行提交的想法。

    有什么想法吗?谢谢。

    最佳答案

    您可以在 sprockets-rails 中找到 precompile 任务的来源。您在本地看不到任何更改的原因可能是指纹识别,它在生产环境中默认启用而在其他环境中禁用(因为使用指纹进行调试可能很麻烦)。您可以使用 config.assets.digest 启用它,如 assets guide 中所述

    正如您提到的,很容易忘记预编译步骤。一个优雅的自动化是从您的存储库中删除已编译的 Assets ,并添加一个 capistrano(或 CI)任务以在每次部署时预编译 Assets 。预编译最好在 CI 服务器上进行(而不是在每个生产服务器上运行)。这种方法还减轻了不断扫描已编译 Assets 以进行更改的需要(您确实不必关心)。

    自动将任何内容提交到您的 repo 是一个坏主意 - 除了无意提交之外,您最终会混淆您的提交历史。

    关于ruby-on-rails - Rails 本地 Assets :precompile - is there an automated way to check for changes?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28888159/

    10-14 19:52
    查看更多