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

在Rails 4和Ruby 2.0中使用资产pipe道的本地机器中一切顺利。 但是在部署到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) 

Heroku似乎编译文件,但将其放入/ tmp没有任何错误。 我的问题是:

  1. Heroku如何将资产文件编译到/ tmp?
  2. 我的最后一个解决scheme是运行RAILS_ENV = production bundle exec rake assets:在本地进行预编译,但是这会在public / assets而不是manifest.yml中生成manifest-xxxxxx.json,因此,heroku不会检测到JSON清单文件。 我通过从json文件中手动创build了一个yml来对它进行整理,而且heroku变得很开心。 Heroku的方法已经过时了吗?

由于Rails 4不支持插件,Heroku的资产插件不再适用。 您需要使用Heroku的资产gem。 把它放在你的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 

按照Heroku的指南开始使用Rails 4。

更新(07/22/2013):Heroku现在为预编译资源提供了一个不同的gem。

 group :production do gem 'rails_12factor' end 

您需要configurationRails以在生产环境中提供静态资源:config / environments / production.rb

 SampleApp :: Application.configure做
   。
   。
   。
   config.serve_static_assets = true
   。
   。
   。
结束

更新:

在Rails 4中被弃用,并被改变了:

 config.serve_static_files = true 

由于rails 4将manifest.ymlreplace为manifest-(fingerprint).json ,所以您需要启用静态资产服务。

从Heroku入门到Rails 4.x :

 gem 'rails_12factor', group: :production 

然后

 bundle install 

最后,

 git push heroku 

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

我正好碰到了同样的问题。

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

所以这是一个暂时的解决scheme,直到heroku支持将被添加。

经过几个小时的search,其中没有Heroku的指南或StackOverFlow的build议帮助了我,我终于碰到了这个提供这个线索的博客文章 :

 heroku labs:enable user-env-compile --app=YOUR_APP 

如果没有这一点,资产pipe道将始终尝试初始化整个应用程序并连接到数据库(尽pipe您可能已经阅读了所有的内容,现在rails 4已经这么做了)。 这暴露你的Herokuconfiguration到Rails,所以它可以成功启动并运行rake任务,如资源:预编译。

我需要使用这个gem:

 gem 'rails_12factor', group: :production #need this for rails 4 assets on heroku 

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

 config.assets.compile = true 

我的理解是, rails_12_factor gem设置config.serve_static_assets = true等等。

在我的情况下,按照上面的说明编译的资产,但它没有select自举glyphicons的“fontawesome-webfont”,所以这工作对我来说,浪费了这么多小时后研究。

gem文件

 gem 'rails_12factor', group: :production 

捆绑安装

configuration/ application.rb中

 config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif, "fontawesome-webfont.ttf", "fontawesome-webfont.eot", "fontawesome-webfont.svg", "fontawesome-webfont.woff") config.assets.precompile << Proc.new do |path| if path =~ /\.(css|js)\z/ full_path = Rails.application.assets.resolve(path).to_path app_assets_path = Rails.root.join('app', 'assets').to_path if full_path.starts_with? app_assets_path puts "including asset: " + full_path true else puts "excluding asset: " + full_path false end else false end end 

环境/ production.rb

 config.serve_static_assets = true 

最后,我运行了rake assets:precompile RAILS_ENV=production ,并将其推送到heroku,并工作。

这是Heroku Ruby Buildpack的一个问题,但今天部署了一个更新(2013-05-21)。 请尝试一下,让我们知道。

回答你的问题:

#1)这是链轮输出; 事情被编译到/tmp ,然后移动( 在这里看到的链轮 )。 据我所知,这一直是这样做的,但直到Sprockets版本在Rails中更新,我们得到了这个新的debuggingtypes的输出。

#2)以前的assets:precompile genereated manifest.json文件,但现在在Rails 4清单文件中有一个指纹,这是以前没有检测到。 这是用#74修复的。

我将其添加到assets / stylesheets /文件夹中的一个css.scss文件的顶部。

 @import "font-awesome"; 

然后跑..

 rake assets:clean 

和…

 rake assets:precompile RAILS_ENV=production 

在Rails 4.2.4中你的production.rb有这样一行:

 config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 

这意味着, gem 'rails_12factor', group: :production不需要将其更改为true,因为它可以通过heroku环境variables进行设置。 如果你删除了rails_12factor gem,你也会得到一个警告。

如果您遇到资产问题 ,请login到heroku控制台heroku run rails console并find文件的资产pathputs helper.asset_path("application.js")

在开发和生产之间我注意到了一个奇怪的行为,当没有提供文件结尾时:

使用图像/assetshttp://img.dovov.comimage_01.jpg asset_paths的以下输出不同:

发展

 development > puts helper.asset_path('profile_01') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg development > puts helper.asset_path('profile_01.jpg') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg 

制作

 development > puts helper.asset_path('profile_01') => /profile_01 development > puts helper.asset_path('profile_01.jpg') => /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg 

您不必运行RAILS_ENV=production rake assets:precompile ,heroku在部署过程中为您执行此操作。 你也不需要预先编译正在开发的资产,并把它们推到heroku。

除了确保您安装了“rails_12factor”gem之外,您唯一需要做的就是这个。

 # config/application.rb config.assets.paths << Rails.root.join('vendor', 'assets') 

看来,虽然Rails确切地知道它想要什么,但Heroku需要提醒将assets文件夹作为资源path的一部分。

添加这个gemgem 'rails_serve_static_assets'

https://github.com/heroku/rails_serve_static_assets

如果您正在使用控制器特定的资产,如:

  <%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %> 

然后在生产中,你将需要明确地预编译(在开发轨道编译文件飞行)。

看官方的Rails指南: http : //guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets

要按照指南(此处: http : //guides.rubyonrails.org/asset_pipeline.html#precompiling-assets )中的说明进行预编译,您需要将以下内容添加到config / application.rb

 # config/application.rb config.assets.precompile << Proc.new do |path| if path =~ /\.(css|js)\z/ full_path = Rails.application.assets.resolve(path).to_path app_assets_path = Rails.root.join('app', 'assets').to_path if full_path.starts_with? app_assets_path puts "including asset: " + full_path true else puts "excluding asset: " + full_path false end else false end end 

我想我会添加这个作为答案,因为这个问题是从Heroku支持页面链接,如果你search"assets"

这主要是为了更新他们的应用程序到Rails 4的人,但经过这个 – 和许多其他的SOpost – 终于让我在production.rb改变以下内容:

 config.action_dispatch.x_sendfile_header = "X-Sendfile" 

至:

 config.action_dispatch.x_sendfile_header = nil 

当我升级时,我还没有抓到这个,像往常一样,这使我永远不知道。 希望它可以帮助别人! 向在问题中提问 /回答同样问题的 PatrickEm大喊 。

使用图像扩展

我有同样的问题,但出于不同的原因。

代替

 <%= asset_path 'facebook-link' %> 

使用:

 <%= asset_path 'facebook-link.png' %> 

虽然第一个在当地工作,当我推到Heroku时,我的图像被打破,我不知道为什么。 使用完整的文件扩展名修复了这个问题:)