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

问题描述 投票:77回答:16

在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没有任何错误。我的问题是:

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

跟随Heroku's guide开始使用Rails 4。

Update (07/22/2013): Heroku now supplies a different gem to precompile assets.

group :production do
  gem 'rails_12factor'
end

2
投票

在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 consoleputs 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。


1
投票

除了确保安装'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文件夹包含在资产路径中。


1
投票

添加此宝石RAILS_ENV=production rake assets:precompile

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


0
投票

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

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

0
投票

我想我会添加这个作为答案,因为如果你搜索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 问道/回答了同样的问题。


0
投票

使用图像扩展

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

代替

PatrickEm

使用:

question

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


0
投票

这可能无法回答原始问题的根本原因,但我有一个类似的症状,具有不同的根本原因。

预编译JPEG文件会将文件扩展名更改为JPG,这意味着<%= asset_path 'facebook-link' %> <%= asset_path 'facebook-link.png' %> 不起作用。从JPEG中删除“e”,瞧,它有效。

其他人在这里描述了同样的问题asset_path("my_image.jpeg")

这是一个错误吗?或期望的行为?并且奇怪的是它只能在我的Heroku托管的生产环境中起作用。也许他们有某种配置。


33
投票

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

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

更新:

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

config.serve_static_files = true 

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

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


14
投票

我遇到了同样的问题。

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

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


13
投票

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

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

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


7
投票

我需要使用这个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等等。


4
投票

在我的情况下,资产按照上面的说明编译,但它没有选择bootstrap glyphicons'fontawesome-webfont'所以这在我浪费了这么多时间研究之后终于为我工作了。

Gem file

gem 'rails_12factor', group: :production

捆绑安装

config/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

environment/production.rb

config.serve_static_assets = true

最后,我跑了rake assets:precompile RAILS_ENV=production并把它推到了heroku,这很有效。


3
投票

这是Heroku Ruby Buildpack的一个问题,但今天更新了部署(2013-05-21)。请试试看,告诉我们。

回答你的问题:

#1)这是链轮输出;事情被编译到/tmp然后移动(见here in Sprockets)。据我所知,这一直是这样做的,但直到Sprockets版本在Rails中更新才得到这个新的调试类型输出。

#2)以前qazxsw poi生成了一个qazxsw poi文件,但是在Rails 4中,清单文件中没有指纹,之前没有检测到。这是用assets:precompile修复的。


2
投票

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

manifest.json

然后跑了..

#74

和...

@import "font-awesome";
© www.soinside.com 2019 - 2024. All rights reserved.