Ruby on Rails:heroku运行rake资产:预编译

use*_*471 11 ruby-on-rails heroku asset-pipeline precompile-assets

请帮我理解究竟heroku run rake assets:precompile是什么.自从我开始在rails上使用ruby之后,我总是在推送到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:cleanheroku run rake assets:precompile一次.问题是一切都运转正常,但我觉得如果有这些警告/错误.请帮我理解.谢谢!

Ric*_*eck 14

预编译

为您提供更清晰的定义 - Heroku并不是唯一需要您"预编译"资产的系统.资产预编译是大多数Rails生产环境的先决条件,因为它允许您提供静态资产(文件) - 完美的速度和效率

以下是Rails文档中有关它的内容:

在生产环境中,Sprockets使用上面概述的指纹识别方案.默认情况下,Rails假设资产已经过预编译,并且将由Web服务器作为静态资产提供.

在预编译阶段,MD5从编译文件的内容生成,并在写入光盘时插入文件名.Rails助手使用这些指纹名称代替清单名称.

Heroku希望您预编译资产的原因是因为Heroku环境的设计是为了提高速度和效率; 因此,不希望在为应用程序的每个请求/实例编译组件时花费CPU功率

这意味着您必须自己预编译资产,或者让Heroku buildpacks为您排序


Heroku的

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

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

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

$ rake assets:precompile RAILS_ENV=production
Run Code Online (Sandbox Code Playgroud)

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


CWi*_*tty 7

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


fbe*_*ger 6

对于任何无法弄清楚为什么Heroku不会自动编译资产的人:

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

我找到了一个sprockets-manifest-*.json,Heroku在删除这个文件后开始自动编译我的资产.

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