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将关闭。
- 如何为开发和生产指定不同版本的gem
- NoMethodError:未定义的方法`’为nil:NilClass推送到Heroku时
- 如何确保我在Heroku上托管的Ruby on Rails应用程序更新了我的GitHub仓库中的最新代码?
- Heroku上的ffmpeg:无法识别的选项’预设’
- Heroku-无法在任何来源中找到paperclip-3.1.3
- Ruby on Rails,Paperclip,亚马逊AWS S3和Heroku
- Heroku安装sqlite3,即使它不是依赖
- 密钥就在那里,但我仍然得到`fetch’:找不到密钥:“S3_BUCKET_NAME”(KeyError)
- 在Heroku上运行连续运行的工作进程