在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没有任何错误。我的问题是:
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
跟随Heroku's guide开始使用Rails 4。
group :production do
gem 'rails_12factor'
end
在Rails 4.2.4中,您的production.rb具有以下行:
rake assets:clean
这意味着,rake assets:precompile RAILS_ENV=production
不需要将其更改为true,因为它可以通过heroku环境变量进行设置。如果删除rails_12factor gem,您也会收到警告。
如果您有config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
,请登录heroku控制台gem 'rails_12factor', group: :production
并找到文件problems with assets的资产路径。
在开发和生产之间注意到的一个奇怪的行为,当没有提供文件结束时:
用图像heroku run rails console
从puts helper.asset_path("application.js")
differs得到以下输出:
发展:
/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
,heroku会在部署期间为您执行此操作。此外,您不必在开发中预编译资产并将其推送到heroku。
除了确保安装'rails_12factor'宝石外,您唯一需要做的就是这样做。
development > puts helper.asset_path('profile_01')
=> /profile_01
development > puts helper.asset_path('profile_01.jpg')
=> /assets/profile_01-bbd16aac5ef1d295411af44c103fcc631ab90ee94957414d4c01c3aed1055714.jpg
似乎虽然Rails确切地知道它想要什么,但Heroku需要提醒将assets文件夹包含在资产路径中。
添加此宝石RAILS_ENV=production rake assets:precompile
# config/application.rb
config.assets.paths << Rails.root.join('vendor', 'assets')
如果您使用控制器特定资产,如:
gem 'rails_serve_static_assets'
然后在生产中,您将需要显式预编译(在开发rails中动态编译文件)。
请参阅官方Rails指南:https://github.com/heroku/rails_serve_static_assets
要按照指南(此处: <%= javascript_include_tag params[:controller] %> or <%= javascript_include_tag params[:controller] %>
)中的说明进行预编译,您需要将以下内容添加到config / application.rb中
http://guides.rubyonrails.org/asset_pipeline.html#controller-specific-assets
我想我会添加这个作为答案,因为如果你搜索http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets,这个问题是从Heroku支持页面链接的。
这主要是为那些将应用程序更新到Rails 4的人,但经过这个 - 以及许多其他SO帖子 - 最终让我改变了# 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
中的以下内容:
"assets"
至:
production.rb
当我升级时,我没有抓住这个,像往常一样,这让我永远想通了。希望它可以帮助别人!向config.action_dispatch.x_sendfile_header = "X-Sendfile"
大声喊叫,他在config.action_dispatch.x_sendfile_header = nil
问道/回答了同样的问题。
这可能无法回答原始问题的根本原因,但我有一个类似的症状,具有不同的根本原因。
预编译JPEG文件会将文件扩展名更改为JPG,这意味着<%= asset_path 'facebook-link' %>
和<%= asset_path 'facebook-link.png' %>
不起作用。从JPEG中删除“e”,瞧,它有效。
其他人在这里描述了同样的问题asset_path("my_image.jpeg")
这是一个错误吗?或期望的行为?并且奇怪的是它只能在我的Heroku托管的生产环境中起作用。也许他们有某种配置。
您需要配置Rails以在生产中提供静态资产:config / environments / production.rb
SampleApp::Application.configure do . . . config.serve_static_assets = true . . . end
更新:
在Rails 4中已弃用,并且已被更改为:
config.serve_static_files = true
从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
解决了我的问题。希望这可以帮助!
我遇到了同样的问题。
我在environment / production.rb文件中设置config.serve_static_assets = true,直到heroku不支持新的清单格式。
所以这是一个时间解决方案,直到添加heroku支持。
经过几个小时的谷歌搜索没有Heroku的指南或StackOverFlow上的建议帮助了我,我终于遇到了this blog post提供了这个线索:
heroku labs:enable user-env-compile --app=YOUR_APP
如果没有这个,资产管道将始终尝试初始化整个应用程序并连接到数据库(尽管你可能已经阅读过所有关于rails 4现在更长的事情)。这会将您的Heroku配置暴露给Rails,以便它可以成功启动并运行rake任务,如assets:precompile。
我需要使用这个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
宝石设置config.serve_static_assets = true
等等。
在我的情况下,资产按照上面的说明编译,但它没有选择bootstrap glyphicons'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,这很有效。
这是Heroku Ruby Buildpack的一个问题,但今天更新了部署(2013-05-21)。请试试看,告诉我们。
回答你的问题:
#1)这是链轮输出;事情被编译到/tmp
然后移动(见here in Sprockets)。据我所知,这一直是这样做的,但直到Sprockets版本在Rails中更新才得到这个新的调试类型输出。
#2)以前qazxsw poi生成了一个qazxsw poi文件,但是在Rails 4中,清单文件中没有指纹,之前没有检测到。这是用assets:precompile
修复的。
我将它添加到assets / stylesheets /文件夹中我的一个css.scss文件的顶部。
manifest.json
然后跑了..
#74
和...
@import "font-awesome";