slug コンパイラ
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年03月09日(水)
Table of Contents
slug は、dyno マネージャへの配布に最適化された、圧縮および事前パッケージ化されたアプリケーションのコピーです。Heroku に対して git push
を実行すると、slug コンパイラがコードを受け取り、リポジトリを slug に変換します。その後、アプリケーションのスケーリングによって slug が dyno にダウンロードされ、展開されて実行されます。
コンパイル
slug コンパイラは git pre-receive hook によって起動され、次のステップに従います。
- マスターブランチから HEAD の新しいチェックアウトを作成します。
- 最上位の
.slugignore
ファイルに指定されているものをすべて削除します。 - ビルドファイル (Gemfile、
package.json
、requirements.txt
、pom.xml
など) の指定に従い、言語 (Bundler、npm、pip、Maven など) でサポートされている依存関係管理ツールを使用して、ローカル依存関係をダウンロード、ビルド、およびインストールします。 - 最終的な slug アーカイブをパッケージ化します。
時間制限
slug のコンパイルは現在 15 分に制限されています。デプロイがコンパイル中にタイムアウトし始めた場合、コンパイルを高速化するには様々な方法がありますが、これらの方法は使用されるビルドツールによって異なります。非常に大きいアプリケーションがタイムアウトする場合、通常は独立したコンポーネントを別々のライブラリに分割する必要があります。dyno のディスク IO パフォーマンスは大きく異なることがあるため、ローカル SSD なら 10 分で完了するコンパイルであっても、デプロイ中に 15 分かかる場合があることに注意してください。
.slugignore
によるファイルの無視
リポジトリにアプリの実行に不要なファイルが含まれている場合、これらのファイルをリポジトリのルートの .slugignore
ファイルに追加した方がよい場合もあります。slug から除外した方がよいファイルの例として、次のものがあります。
- アートソース (.psd ファイルなど)
- デザイン文書 (.pdf ファイルなど)
- テストデータ
形式は .gitignore
とほぼ同じです。.slugignore
の例を次に示します。
# Heres a comment
*.psd
*.pdf
/test
/spec
Heroku CI ユーザー: テストディレクトリを .slugignore
にリストアップしないでください。 これは無視され、テストが Heroku CI で実行されなくなります。
.slugignore
ファイルにより、コードを Heroku にプッシュした後、buildpack が実行される前に、ファイルが除去されます。こうすることで、大量のファイルが最終的な slug に含まれなくなります。.gitignore
とは異なり、.slugignore
は否定の !
パターンをサポートしません。
また、不要なファイル (log
や tmp
ディレクトリなど) が git によって追跡されないようにすることで、不要なファイルの数を削減することもでき、この場合もファイルは Heroku にデプロイされません。.gitignore ファイルの使用を参照してください。
slug のサイズ
slug のサイズは、正常に行われたコンパイルの最後に Compressing
メッセージの後に表示されます。許容される最大の slug サイズ (圧縮後) は 500 MB です。
heroku run bash
で、ls
や du
などのコマンドを使用して、slug の抽出された内容を調査できます。
slug のサイズは、ご使用の言語やフレームワーク、追加した依存関係の数、アプリに固有のその他の要素によって大きく変わります。slug が小さいほど dyno マネージャに迅速に転送できるため、すばやいスケーリングが可能です。slug はできるだけ小さく軽快な状態にしてください。
slug のサイズを削減するには次のような手法があります。
- PDF や音声ファイルなどの大きいアセットをアセットストレージに移動する。
- 不要な依存関係を削除し、
.slugignore
を使用して不要なファイルを除外する。 - ビルドキャッシュをパージする。
ビルドキャッシュ
buildpack は、オプションで、内容 (アプリの依存関係など) をキャッシュに入れ、将来のビルドの速度を大幅に向上させることができます。
ビルド問題がこのキャッシュのエラーによって引き起こされていると疑われる場合は、heroku-builds プラグインを使用してパージまたは消去できます。
$ heroku plugins:install heroku-builds
$ heroku builds:cache:purge