77

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=production bundle exec rake assets:precompile をローカルで実行することでしたが、これにより、manifest.yml ではなく public/assets に manifest-xxxxxx.json が生成され、heroku が JSON マニフェスト ファイルを検出しなくなりました。jsonファイルから手動でymlを作成して整理したらherokuが楽になりました。heroku のアプローチは時代遅れですか?
4

16 に答える 16

102

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

Rails 4 の使用を開始するには、Heroku のガイドに従ってください。

更新 (2013 年 7 月 22 日): Heroku は、アセットをプリコンパイルするための別の gem を提供するようになりました。

group :production do
  gem 'rails_12factor'
end
于 2013-05-15T17:34:46.213 に答える
33

本番環境で静的アセットを提供するには、Rails を構成する必要があります: config/environments/production.rb

SampleApp::Application.configure do
  .
  .
  .
  config.serve_static_assets = true
  .
  .
  .
終わり

アップデート:

Rails 4 は廃止され、次のように変更されました。

config.serve_static_files = true 
于 2013-05-21T21:48:40.420 に答える
16

Rails 4 では manifest.yml が manifest-(fingerprint).json に置き換えられたため、静的アセットの提供を有効にする必要があります。

Heroku で Rails 4.x を使い始めるから:

gem 'rails_12factor', group: :production

それから

bundle install

そして最後に、

git push heroku

私の問題を修正しました。お役に立てれば!

于 2013-06-29T00:42:13.513 に答える
14

私はまったく同じ問題に遭遇します。

Heroku が新しいマニフェスト形式をサポートしなくなるまで、environments/production.rb ファイルで config.serve_static_assets = true を設定しました。

したがって、heroku のサポートが追加されるまでの一時的な解決策です。

于 2013-03-16T11:33:11.957 に答える
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

于 2014-07-24T17:54:08.920 に答える
4

私の場合、アセットは上記の手順に従ってコンパイルされましたが、ブートストラップ グリフィコン 'fontawesome-webfont' が選択されていなかったため、調査に多くの時間を費やした後、最終的にこれが機能しました。

宝石ファイル

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

環境/生産.rb

config.serve_static_assets = true

最後に、実行 rake assets:precompile RAILS_ENV=productionしてherokuにプッシュしたところ、うまくいきました。

于 2013-07-24T11:43:41.587 に答える
3

これは Heroku Ruby Buildpack の問題でしたが、本日 (2013-05-21) 更新がデプロイされました。ぜひお試しいただき、お知らせください。

質問に答えるには:

#1) これはスプロケット出力です。物事はコンパイルされてから/tmp移動されます(ここでスプロケットを参照してください)。私の知る限り、これは常にこの方法で行われてきましたが、Sprockets のバージョンが Rails で更新されるまで、この新しいデバッグ タイプの出力が得られませんでした。

#2)以前assets:precompileはファイルを生成manifest.jsonしていましたが、Rails 4ではマニフェストファイルに以前は検出されなかったフィンガープリントが含まれています。これは#74で修正されました。

于 2013-05-21T14:47:33.783 に答える
2

これを、assets/stylesheets/ フォルダー内の css.scss ファイルの 1 つに追加しました。

@import "font-awesome";

それから走った..

rake assets:clean

と...

rake assets:precompile RAILS_ENV=production
于 2013-11-08T19:22:09.343 に答える
1

「rails_12factor」gem がインストールされていることを確認する以外に必要なことは、これだけです。

# config/application.rb

config.assets.paths << Rails.root.join('vendor', 'assets')

Rails は必要なものを正確に認識しているようですが、Heroku はアセット フォルダーをアセット パスの一部として含めるように注意する必要があります。

于 2014-11-11T00:51:22.277 に答える
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
于 2014-06-08T22:48:13.970 に答える
0

を検索すると、この質問はHerokuサポートページからリンクされているため、これを回答として追加すると思います"assets"

これは主に自分のアプリを Rails 4 に更新する人向けですが、これ (および他の多くの SO 投稿) を経て、最終的に私が得たのはproduction.rb.

config.action_dispatch.x_sendfile_header = "X-Sendfile"

に:

config.action_dispatch.x_sendfile_header = nil

アップグレードしたときにこれを見つけられなかったので、いつものように、これを理解するのに永遠にかかりました. うまくいけば、それは他の誰かに役立ちます!彼の質問で同じことを尋ねた/答えたPatrickEmに叫びます。

于 2014-09-01T22:47:16.523 に答える