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

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

预编译

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

以下是Rails文档中所说的内容:

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

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

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

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


Heroku的

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

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

尽管Heroku确实在构建过程中执行预编译,但通过在本地预编译,您将更加安全(从exception的角度来看):

 $ rake assets:precompile RAILS_ENV=production 

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

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

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

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

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

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

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