请帮助我了解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
。问题是一切都运转良好,但我觉得如果有这些警告/错误。请帮我理解。谢谢!
答案 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将会关闭。