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

时间:2013-03-12 06:14:38

标签: heroku asset-pipeline ruby-on-rails-4

在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的方法已经过时了吗?

16 个答案:

答案 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

更新(2013年7月22日):Heroku现在为预编译资产提供了不同的gem。

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

捆绑安装

配置/ 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并且有效。

答案 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.jpgasset_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'

https://github.com/heroku/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托管的生产环境中工作。也许他们有某种配置。