【问题标题】:Ruby on Rails: heroku run rake assets:precompileRuby on Rails:heroku 运行 rake 资产:预编译
【发布时间】:2014-08-11 23:14:36
【问题描述】:

请帮助我了解heroku run rake assets:precompile 究竟做了什么。自从我开始研究 ruby​​ on rails 以来,我总是在推送到 github 和 heroku 之前运行这三个命令:

bundle exec rake assets:precompile

RAILS_ENV=production bundle exec rake assets:precompile

推送到heroku后,我会运行:

heroku run rake assets:precompile

但是,当我在上次推送到 heroku 后尝试运行它时,我在不同的文件上遇到了一堆相同的错误。例如:

Warning. Error encountered while saving cache ... can't dump anonymous class ...

为了看看我能不能解决这个问题,我跑了

heroku run rake assets:clean 然后再次heroku run rake assets:precompile。问题是一切正常,但我只是觉得有所有这些警告/错误。请帮我理解。谢谢!

【问题讨论】:

    标签: ruby-on-rails heroku asset-pipeline precompile-assets


    【解决方案1】:

    预编译

    为了给您一些更清晰的定义 - Heroku 并不是唯一需要您“预编译”资产的系统。资产预编译是大多数 Rails 生产环境的先决条件,因为它允许您提供静态资产(文件) - 非常适合速度和效率

    Rails documentation 对此是这么说的:

    在生产环境中 Sprockets 使用指纹方案 以上概述。默认情况下,Rails 假定资产已经预编译 并将由您的网络服务器作为静态资产提供。

    在预编译阶段,会根据内容生成 MD5 已编译的文件,并按原样插入到文件名中 写入光盘。 Rails 使用这些指纹名称 助手代替清单名称。

    Heroku 希望您预编译资产的原因是因为 Heroku 环境旨在提高速度和效率;因此不想在为您的应用程序的每个请求/实例编译资产时消耗 CPU 资源

    这意味着您必须自己预编译资产,或者让Heroku buildpacks 为您解决这些问题


    Heroku

    正如CWitty 所述,您需要确保在本地编译资产。虽然我不确定您收到的错误,但我知道一件事:预编译会填充 public/assets 文件夹

    这意味着如果您在本地预编译提交到 Heroku,您将在您的 public/assets 目录中显示所有最新资产在尝试运行应用程序之前在 Heroku 上

    虽然 Heroku 确实将预编译作为构建过程的一部分,但通过在本地进行预编译(从异常的角度来看)会更安全:

    $ rake assets:precompile RAILS_ENV=production
    

    这将使您能够填充 public/assets 文件夹,然后您可以毫无问题地推送到 Heroku

    【讨论】:

    • 所以我注意到 rake assets:precompile RAILS_ENV=productionrake assets:precompile 似乎是互斥的,创建不同的文件。我只需要运行生产预编译命令,然后推送?我已经做到了,但资产没有显示。还有什么问题?
    • 很好的解释,顺便说一句。比 Heroku 的文章好多了。
    • RAILS_ENV=production bundle exec rake assets:precompilerake assets:precompile RAILS_ENV=production有什么区别?
    【解决方案2】:

    您应该在推送到 Heroku 之前运行此命令,因为它会**预**编译您的资产。如果您缺少 manifast.yml 文件,Heroku 将自动运行此命令。在本地运行 rake assets:precompile 后,您可以提交所有更改,然后推送到 Heroku。

    【讨论】:

    • 感谢您的回答。你知道我为什么会收到警告吗?你是说我可以忽略这些吗?
    • 我不会忽略它们。一旦您的代码在 Heroku 上,我就不会继续运行。我会在推送到 Heroku 之前这样做。
    【解决方案3】:

    对于任何难以弄清楚 Heroku 不会自动编译您的资产的原因的人:

    如果在您的应用中检测到 public/assets/manifest.yml,Heroku 将假定您正在自己处理资产编译,并且不会尝试编译您的资产。 Rails 4 使用了一个名为 public/assets/manifest-.json 的文件。在这两个版本上,您都可以通过在本地运行 $ rake assets:precompile 并将生成的文件检入 Git 来生成此文件。

    我找到了sprockets-manifest-*.json,并且在我删除此文件后,Heroku 开始自动编译我的资产。

    在我的例子中,这个文件是由脚本rails_composer生成的。

    【讨论】:

      【解决方案4】:

      如果您有任何 .jpeg,请确保在编译之前将它们更改为 .jpg。编译步骤将为您完成,但如果您指定带有扩展名的文件,您的 image_tags 将关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 2014-02-19
        相关资源
        最近更新 更多