在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)
Heroku似乎编译文件但是把它放在/ tmp中没有任何错误。我的问题是:
答案 0 :(得分: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
关于开始使用Rails 4时,请关注Heroku's guide。
group :production do
gem 'rails_12factor'
end
答案 1 :(得分:33)
您需要配置Rails以在生产中提供静态资产:config / environments / production.rb
SampleApp::Application.configure do . . . config.serve_static_assets = true . . . end
更新:
在Rails 4中已弃用,并且已被更改:
config.serve_static_files = true
答案 2 :(得分:16)
自rails 4 replaced manifest.yml with manifest-(fingerprint).json起,您需要启用静态资产投放。
来自Getting Started with Rails 4.x on Heroku:
gem 'rails_12factor', group: :production
然后
bundle install
,最后,
git push heroku
为我解决了这个问题。希望这有帮助!
答案 3 :(得分:14)
我遇到了同样的问题。
我在environment / production.rb文件中设置了config.serve_static_assets = true,直到heroku不支持新的清单格式。
因此,在添加heroku支持之前,这是一个时间解决方案。
答案 4 :(得分:13)
经过数小时的谷歌搜索,没有Heroku的指南或StackOverFlow上的建议对我有帮助,我终于遇到this blog post提供了这个线索:
heroku labs:enable user-env-compile --app=YOUR_APP
如果没有这个,资产管道将始终尝试初始化整个应用程序并连接到数据库(尽管你可能已经阅读过所有关于rails 4现在更长的事情)。这会将您的Heroku配置暴露给Rails,以便它可以成功启动并运行rake任务,如assets:precompile。
答案 5 :(得分:7)
我需要使用这个宝石:
gem 'rails_12factor', group: :production #need this for rails 4 assets on heroku
在/config/environments/production.rb中,我需要设置:
config.assets.compile = true
我的理解是rails_12_factor
宝石集config.serve_static_assets = true
等等。
答案 6 :(得分:4)
就我而言,资产是按照上述说明编制的,但它并没有选择引导程序字形'fontawesome-webfont',因此在浪费了这么多时间研究之后,这对我有用。
gem 'rails_12factor', group: :production
捆绑安装
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
config.serve_static_assets = true
最后,我跑了
rake assets:precompile RAILS_ENV=production
并将其推送到heroku并且有效。
答案 7 :(得分:3)
这是Heroku Ruby Buildpack的一个问题,但今天部署了更新(2013-05-21)。请试试看,告诉我们。
回答你的问题:
#1)这是链轮输出;将事物编译为/tmp
然后移动(参见here in Sprockets)。据我所知,这一直是这样做的,但直到Sprockets版本在Rails中更新才得到这个新的调试类型输出。
#2)以前assets:precompile
生成manifest.json
文件,但现在在Rails 4中,清单文件中有一个指纹,之前未检测到。这是通过#74修复的。
答案 8 :(得分:2)
我将它添加到assets / stylesheets /文件夹中我的一个css.scss文件的顶部。
@import "font-awesome";
然后跑了..
rake assets:clean
和...
rake assets:precompile RAILS_ENV=production
答案 9 :(得分:2)
在Rails 4.2.4中,您的production.rb包含以下行:
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
这意味着,gem 'rails_12factor', group: :production
不需要将其更改为true,因为它可以通过heroku环境变量进行设置。如果删除rails_12factor gem,您也会收到警告。
如果您有problems with assets,请登录heroku控制台heroku run rails console
并查找文件puts helper.asset_path("application.js")
的资产路径。
在开发和生产之间注意到一个奇怪的行为,当没有提供文件结束时:
使用图片/assets/images/image_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。
答案 10 :(得分:1)
除了确保你安装了'rails_12factor'宝石外,你唯一需要做的就是这个。
# config/application.rb
config.assets.paths << Rails.root.join('vendor', 'assets')
似乎虽然Rails确切知道它想要什么,但Heroku需要提醒将assets文件夹包含在资产路径中。
答案 11 :(得分:1)
添加此gem gem 'rails_serve_static_assets'
答案 12 :(得分:0)
如果您使用控制器特定资产,请执行以下操作:
<%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %>
然后在生产中你需要明确地预编译那些(在开发rails中动态编译文件)。
请参阅此处的官方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
答案 13 :(得分:0)
我想我会将此作为答案添加,因为如果您搜索"assets"
,此问题会从Heroku支持页面链接。
这主要是针对那些将应用更新到Rails 4的人,但经过这个 - 以及其他许多SO帖子 - 最终让我改变了production.rb
中的以下内容:
config.action_dispatch.x_sendfile_header = "X-Sendfile"
要:
config.action_dispatch.x_sendfile_header = nil
当我升级时,我没有抓住这个,像往常一样,这让我永远想通了。希望它可以帮助别人!向他PatrickEm中提出/回答相同问题的question致敬。
答案 14 :(得分:0)
使用图片扩展程序
我有同样的问题,但出于不同的原因。
而不是
<%= asset_path 'facebook-link' %>
使用:强>
<%= asset_path 'facebook-link.png' %>
当第一个在本地工作时,当我推到Heroku时,我的图像被破坏了,我不知道为什么。使用完整的文件扩展名修复了问题:)
答案 15 :(得分:0)
这可能无法回答原始问题的根本原因,但我的症状与根本原因有所不同。
JPEG文件的预编译会将文件扩展名更改为JPG,这意味着asset_path("my_image.jpeg")
和asset_path("my_image")
无法正常工作。删除&#34; e&#34;从JPEG和瞧,它的确有效。
其他人在这里描述了同样的问题https://blazarblogs.wordpress.com/2016/04/06/rails-force-to-precompile-jpeg-to-jpg/
这是一个错误吗?或期望的行为?并且奇怪的是它只能在我的Heroku托管的生产环境中工作。也许他们有某种配置。