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

时间:2014-08-11 23:14:37

标签: 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:clean然后再次heroku run rake assets:precompile。问题是一切都运转良好,但我觉得如果有这些警告/错误。请帮我理解。谢谢!

4 个答案:

答案 0 :(得分:13)

<强>预编译

为了给您一些更清晰的定义 - 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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

  

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

我找到了atom-pane-manager git:master ❯ git log --pretty=oneline -n 1 | pbcopy # => 73b3c240ff9b35d760d8e4302308d3c0e725fc76 Prepare 1.0.1 release ,Heroku在删除此文件后开始自动编译我的资源。

就我而言,这个文件是由脚本sprockets-manifest-*.json生成的。

答案 3 :(得分:0)

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