web-dev-qa-db-ja.com

Ruby on Rails:heroku run rake Assets:precompile

何を理解するのを手伝ってくださいheroku run rake assets:precompileまさにそうです。 RailsでRubyに取り組み始めて以来、githubとherokuにプッシュする前に、常に次の3つのコマンドを実行していました。

bundle exec rake assets:precompile

Rails_ENV=production bundle exec rake assets:precompile

Herokuにプッシュした後、実行します。

heroku run rake assets:precompile

ただし、最後にHerokuにプッシュした後で実行しようとすると、さまざまなファイルで同じエラーが多数発生しました。例えば:

Warning. Error encountered while saving cache ... can't dump anonymous class ...

これを修正できるかどうかを確認するために、実行しました

heroku run rake assets:clean その後 heroku run rake assets:precompile再び。問題はすべてが正常に機能しているということですが、私はこれらすべての警告/エラーを持っていることに不安を感じています。私が理解するのを手伝ってください。ありがとうございました!

11
user3104471

プリコンパイル

より明確な定義を与えるために-Herokuは、アセットを「プリコンパイル」する必要がある唯一のシステムではありません。アセットの事前コンパイルは、ほとんどのRails本番環境の前提条件です。静的アセット(ファイル)を提供できるため、速度と効率に最適です。

Railsのドキュメント は次のように述べています。

実稼働環境では、Sprocketsは上記のフィンガープリント方式を使用します。デフォルトでは、Railsは、アセットがプリコンパイルされており、Webサーバーによって静的アセットとして提供されることを前提としています。

コンパイル前のフェーズでは、コンパイルされたファイルの内容からMD5が生成され、ディスクに書き込まれるときにファイル名に挿入されます。これらのフィンガープリント名は、マニフェスト名の代わりにRailsヘルパーによって使用されます。

Herokuがアセットのプリコンパイルを要求する理由は、Heroku環境が速度と効率を重視して設計されているためです。したがって、アプリのリクエスト/インスタンスごとにアセットをコンパイルするためにCPUパワーを消費したくない

つまり、アセットを自分でプリコンパイルするか、 Heroku buildpacks で整理する必要があります。


Heroku

CWittyで述べたように、アセットをローカルでコンパイルすることを確認する必要があります。受け取ったエラーについてはよくわかりませんが、1つだけ知っています。プリコンパイルによってpublic/assetsフォルダーにデータが入力されます

つまり、ローカルでプリコンパイルする場合before Herokuに送信すると、public/assetsディレクトリにすべての最新のアセットが存在しますbeforeアプリケーションを実行しようとすると、 Heroku

Herokuはビルドプロセスの一部としてプリコンパイルを実行しますが、ローカルでプリコンパイルすることで(例外の観点から)はるかに安全になります。

$ rake assets:precompile Rails_ENV=production

これにより、public/assetsフォルダーにデータを入力できるようになり、問題なくHerokuにプッシュできるようになります。

14
Richard Peck

アセットを**事前**コンパイルするため、Herokuにプッシュする前にこのコマンドを実行する必要があります。 manifast.ymlファイルがない場合、Herokuはこのコマンドを自動的に実行します。実行後rake assets:precompileローカルでは、すべての変更をコミットしてから、Herokuにプッシュできます。

7
CWitty

Herokuがアセットを自動的にコンパイルしない理由を理解するのに苦労している人のために:

アプリでpublic/assets/manifest.ymlが検出された場合、Herokuはアセットのコンパイルを自分で処理していると見なし、アセットのコンパイルを試みません。 Rails 4は、代わりにpublic/assets /manifest-.jsonというファイルを使用します。どちらのバージョンでも$ rake Assets:precompileをローカルで実行し、結果のファイルをGitにチェックインすることでこのファイルを生成できます。

sprockets-manifest-*.jsonを見つけ、このファイルを削除した後、Herokuがアセットのコンパイルを自動的に開始しました。

私の場合、このファイルはスクリプトRails_composerによって生成されました。

6
fbelanger

.jpegがある場合は、コンパイルする前に必ず.jpgに変更してください。コンパイル手順で自動的に実行されますが、拡張子を付けてファイルを指定している場合は、image_tagsがオフになります。

1
Jbur43