何を理解するのを手伝ってください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
再び。問題はすべてが正常に機能しているということですが、私はこれらすべての警告/エラーを持っていることに不安を感じています。私が理解するのを手伝ってください。ありがとうございました!
プリコンパイル
より明確な定義を与えるために-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にプッシュできるようになります。
アセットを**事前**コンパイルするため、Herokuにプッシュする前にこのコマンドを実行する必要があります。 manifast.ymlファイルがない場合、Herokuはこのコマンドを自動的に実行します。実行後rake assets:precompile
ローカルでは、すべての変更をコミットしてから、Herokuにプッシュできます。
Herokuがアセットを自動的にコンパイルしない理由を理解するのに苦労している人のために:
アプリでpublic/assets/manifest.ymlが検出された場合、Herokuはアセットのコンパイルを自分で処理していると見なし、アセットのコンパイルを試みません。 Rails 4は、代わりにpublic/assets /manifest-.jsonというファイルを使用します。どちらのバージョンでも$ rake Assets:precompileをローカルで実行し、結果のファイルをGitにチェックインすることでこのファイルを生成できます。
sprockets-manifest-*.json
を見つけ、このファイルを削除した後、Herokuがアセットのコンパイルを自動的に開始しました。
私の場合、このファイルはスクリプトRails_composer
によって生成されました。
.jpegがある場合は、コンパイルする前に必ず.jpgに変更してください。コンパイル手順で自動的に実行されますが、拡張子を付けてファイルを指定している場合は、image_tagsがオフになります。