Heroku不会在Rails 4中的资产管道下编译文件

aqu*_*ach 77 heroku asset-pipeline ruby-on-rails-4

在Rails 4和Ruby 2.0中使用资产管道的本地机器上一切顺利.但是当部署到heroku时,它显示:

-----> Preparing app for Rails asset pipeline
   Running: rake assets:precompile
   I, [2013-03-12T03:28:29.908234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/rails-2ee5a98f26fbf8c6c461127da73c47eb.png
   I, [2013-03-12T03:28:29.914096 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/trash-3c3c2861eca3747315d712bcfc182902.png
   I, [2013-03-12T03:28:33.963234 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-bf2525bd32aa2a7068dbcfaa591b3874.js
   I, [2013-03-12T03:28:40.362850 #912]  INFO -- : Writing /tmp/build_1n6yi8lwna3sj/public/assets/application-13374a65f29a3b4cea6f8da2816ce7ff.css
   Asset precompilation completed (14.36s)
Run Code Online (Sandbox Code Playgroud)

Heroku似乎编译文件,但把它放在/ tmp没有任何错误.我的问题是:

  1. 为什么Heroku将资源文件编译为/ tmp?
  2. 我的最后一个解决方案是运行RAILS_ENV =生产包exec rake资产:在本地预编译,但这在public/assets中生成了manifest-xxxxxx.json,而不是manifest.yml,因此heroku不会检测JSON清单文件.我通过从json文件手动创建了一个yml来解决它,并且heroku变得很开心.heroku的方法已经过时了吗?

Jos*_*ber 102

Heroku的资产插件不再有效,因为Rails 4不支持插件.你需要使用Heroku的资产宝石.把它放在你的Gemfile中:

group :production do
  gem 'rails_log_stdout',           github: 'heroku/rails_log_stdout'
  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
end
Run Code Online (Sandbox Code Playgroud)

按照Heroku的指南如何开始使用Rails 4.

更新(2013年7月22日):Heroku现在提供不同的宝石来预编译资产.

group :production do
  gem 'rails_12factor'
end
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说不是必需的.只需按照@Israel Barba的回答将`config.serve_static_assets = false`改为`true`. (14认同)
  • 你在CSS和其他地方使用asset_path()帮助器吗?通过"/assets/filename.jpg"引用资源也不适用于Heroku. (4认同)
  • 我之前已经这样做了,但我相信如果你这样做,你必须预先编译资产并自己提交.这还是正确的吗? (2认同)
  • 这不起作用.也没有预编译.对于我们来说,资产管道在用于轨道4的heroku上被打破了,我们浪费了大量的时间,回到ec2 - 发牢骚的抱怨. (2认同)

Isr*_*rba 33

您需要配置Rails以在生产中提供静态资产:config/environments/production.rb

SampleApp::Application.configure do
  .
  .
  .
  config.serve_static_assets = true
  .
  .
  .
end

更新:

在Rails 4中已弃用,并且已被更改为:

config.serve_static_files = true 
Run Code Online (Sandbox Code Playgroud)


小智 16

由于rails 4将manifest.yml替换为manifest-(fingerprint).json,因此您需要启用静态资产服务.

Heroku上的Rails 4.x入门:

gem 'rails_12factor', group: :production
Run Code Online (Sandbox Code Playgroud)

然后

bundle install
Run Code Online (Sandbox Code Playgroud)

最后,

git push heroku
Run Code Online (Sandbox Code Playgroud)

解决了我的问题.希望这可以帮助!


Bot*_*oti 14

我遇到了同样的问题.

我在environment/production.rb文件中设置config.serve_static_assets = true,直到heroku不支持新的清单格式.

所以这是一个时间解决方案,直到添加heroku支持.

  • 如果您提供静态资产,它将起作用,但它不适用于拥有自己资产的所有宝石,如Font Awesome或HTML5 Boilerplate. (5认同)

Pat*_*kEm 13

经过几个小时的谷歌搜索没有Heroku的指南或StackOverFlow上的建议帮助了我,我终于遇到了这个提供这个线索的博客文章:

heroku labs:enable user-env-compile --app=YOUR_APP
Run Code Online (Sandbox Code Playgroud)

如果没有这个,资产管道将始终尝试初始化整个应用程序并连接到数据库(尽管你可能已经阅读过所有关于rails 4现在更长的事情).这会将您的Heroku配置暴露给Rails,以便它可以成功启动并运行rake任务,如assets:precompile.

  • "没有这样的功能:user-env-compile" (9认同)

wul*_*ong 7

我需要使用这个gem:

gem 'rails_12factor', group: :production #need this for rails 4 assets on heroku
Run Code Online (Sandbox Code Playgroud)

在/config/environments/production.rb中,我需要设置:

config.assets.compile = true
Run Code Online (Sandbox Code Playgroud)

我的理解是rails_12_factor宝石套装config.serve_static_assets = true等等.