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没有任何错误。 我的问题是:
- Heroku如何将资产文件编译到/ tmp?
- 我的最后一个解决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'
如果您正在使用控制器特定的资产,如:
<%= 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时,我的图像被打破,我不知道为什么。 使用完整的文件扩展名修复了这个问题:)