web-dev-qa-db-ja.com

Herokuは、Rails 4のアセットパイプラインの下でファイルをコンパイルしません

Rails 4 and Ruby 2.0。

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

Rails 4はプラグインをサポートしないため、代わりに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

Herokuのガイド Rails 4。

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

group :production do
  gem 'Rails_12factor'
end
102
Joseph Jaber

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

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

更新:

In Rails 4は非推奨であり、次のように変更されました。

config.serve_static_files = true 
33
Israel Barba

Rails 4はmanifest.ymlをmanifest-(fingerprint).json に置き換えたため、静的なアセットサービングを有効にする必要があります。

から Getting Started with Rails 4.x

gem 'Rails_12factor', group: :production

それから

bundle install

そして最後に、

git Push heroku

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

16
voss

私はまったく同じ問題にぶつかります。

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

そのため、herokuのサポートが追加されるまでは一時的なソリューションです。

14
Boti

HerokuのガイドもStackOverFlowの提案も役に立たなかった数時間のグーグル検索の後、私はついに このブログ投稿 に遭遇しました。

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

これがないと、アセットパイプラインは常にアプリ全体を初期化してデータベースに接続しようとします(Rails 4はこれを行うようになりました)。 Railsに設定すると、正常に起動し、assets:precompileなどのrakeタスクを実行できます。

13
PatrickEm

この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、 そのことなど。

7
wuliwong

私の場合、アセットは上記の手順に従ってコンパイルされましたが、bootstrap glyphicons '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

environment/production.rb

config.serve_static_assets = true

そして最後に、rake assets:precompile Rails_ENV=productionそしてそれをherokuにプッシュしましたが、うまくいきました。

4

これはHeroku Ruby Buildpackの問題でしたが、今日(2013-05-21)に更新プログラムが展開されました。試してみてください。

質問に答えるには:

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

#2)以前はassets:precompile生成されたmanifest.jsonファイルですが、現在Rails 4にあります。マニフェストファイルにはフィンガープリントがあり、以前は検出されませんでした。これは #74 で修正されました。

3
catsby

In Rails 4.2.4 production.rbには次の行があります。

_config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?
_

つまり、_gem 'Rails_12factor', group: :production_は、heroku環境変数で設定できるため、trueに変更する必要はありません。 Rails_12factor gemを削除すると、警告も表示されます。

アセットの問題 がある場合は、herokuコンソール_heroku run Rails console_にログインし、ファイルputs helper.asset_path("application.js")のアセットパスを見つけます。

ファイルの終わりが提供されていないときに、開発と本番の間で気づいた奇妙な動作:

イメージ_/assets/images/image_01.jpg_では、_asset_paths_ differsからの次の出力:

開発

_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
_

あなたはnot_Rails_ENV=production rake assets:precompile_を実行する必要がありますが、herokuはデプロイ中にこれを行います。また、開発中のアセットをプリコンパイルしてherokuにプッシュする必要もありません。

2
neonmate

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

@import "font-awesome";

その後、走った..

rake assets:clean

そして...

rake assets:precompile Rails_ENV=production
2
tuneyfish

この宝石を追加gem 'Rails_serve_static_assets'

https://github.com/heroku/Rails_serve_static_assets

1
Ben

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

# config/application.rb

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

Railsは必要なものを正確に知っていますが、Herokuは、アセットパスの一部としてアセットフォルダを含めることを思い出す必要があるようです。

1
Evolve

イメージ拡張機能を使用

私はこれと同じ問題を抱えていましたが、理由は異なります。

代わりに

<%= asset_path 'facebook-link' %>

使用:

<%= asset_path 'facebook-link.png' %>

最初のものはローカルで機能していましたが、Herokuにプッシュしたときにイメージが壊れていたので、理由がわかりませんでした。完全なファイル拡張子を使用すると、問題が修正されました:)

1
Phil

次のようにコントローラー固有の資産を使用している場合:

 <%= 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
0
Andrea

この質問は、"assets"

これは主に、アプリをRails 4に更新しているが、これを通過した後-および他の多くのSO投稿-最終的に私が得たものは変わっていたproduction.rb

config.action_dispatch.x_sendfile_header = "X-Sendfile"

に:

config.action_dispatch.x_sendfile_header = nil

アップグレードしたとき、私はこれを捕らえていませんでしたが、いつものように、これを理解するのに永遠にかかりました。うまくいけば、それは他の誰かを助ける! PatrickEm質問 で同じ質問/回答をした人に叫ぶ。

0
tvalent2

これは元の質問の根本原因に答えない場合がありますが、別の根本原因で同様の症状がありました。

JPEGファイルをプリコンパイルすると、ファイル拡張子がJPGに変更されます。つまり、asset_path("my_image.jpeg")およびasset_path("my_image")は機能しませんでした。 JPEGから「e」を削除して、出来上がり。

他の人がここで同じ問題を説明しています https://blazarblogs.wordpress.com/2016/04/06/Rails-force-to-precompile-jpeg-to-jpg/

これはバグですか?または望ましい行動ですか?また、Herokuがホストする本番環境でしか機能しないことも奇妙です。たぶん、彼らは何らかの構成を持っています。

0
Anthony Wood