-
Notifications
You must be signed in to change notification settings - Fork 9
slug compiler
slugとは、圧縮され、事前にパッケージされたアプリケーションのコピーのことです。
アプリケーションは、dyno manifoldを経由し、高速なディストリビューションを可能とするために
最適化されています。Herokuへgit push
する際、slug compilerがコードを受け取り、リポジトリをslugへ変換します。
その後で、アプリケーションのスケーリングが行われ、実行のためにslugをダウンロードし、dynoへと展開します。
slug compilerは、git pre-receive hookにより呼び出され、以下のステップで実行されます。:
-
マスターブランチから新規のHEADのチェックアウトを作成します。
-
.git
ディレクトリ、log
とtmp
にある全ファイル、最上位の.slugignore
に指定された全ファイルを含めた未使用のファイルをリムーブします。 -
ダウンロード後、ビルドし、さらにビルドファイル(例えば、Gemfile、
package.json
、requirements.txt
、pom.xml
等)に指定されたローカルの依存関係をインストールします。その際、プログラミング言語毎にサポートされている依存関係のマネージメントツール(例:Bundler、 npm、 pip、 Maven)を使用します。 -
最終的なslugのアーカイブをパッケージ化します。
アプリを実行する上で不要なファイルがリポジトリに含まれている場合、リポジトリのルートに存在する.slugignore
へ、これらのファイルの情報を追加したくなることでしょう。slugから除外するファイルとして、例えば以下のようなものがあります。:
- 単体テスト または、単体仕様
- アート系のソース(.psdファイルのような)
- デザイン系のドキュメント(.pdfファイルのような)
- テストデータ
フォーマットに関しては、!
の否定演算子をサポートしていないことを除けば、ほぼ.gitignore
に近い形式です。以下、.slugignore
の例となります。:
:::text
*.psd
*.pdf
test
spec
.slugignore
ファイルは、このファイルに記載されたものとマッチしたアセットを最終的なslugに含めないことを保証します。
これらのアセットは、.slugignore
ファイルに記載する前は、アプリケーションをディプロイした際に、Herokuへプッシュされていたこととなります。
gitにより追跡されないことを確約することで、さらに不要なファイル(例えば、log
とtmp
のディレクトリ)を減らすことが可能です。この場合、これらのファイルはHerokuへディプロイされることはありません。.gitignore ファイルの使い方を参照して下さい。
コンパイル成功時、slugのサイズが表示されます。新規のチェックアウトを行い、.git
ディレクトリを削除し、さらに、du -hsc
コマンドを実行することで、大まかなslugのサイズをローカル環境で見積もることも可能です。
:::term
$ du -hsc | grep total
2.9M total
slugの最大サイズは、200MBです。ほとんどのアプリケーションが、このサイズを遥かに下回ることでしょう。
slugが小さければ小さいほど、dyno manifoldを経由する変換が早く行われ、スケーリング自体もより即時に実行されることとなります。一般的に言って、15MB以下のslugは、十分に小さく機動的であると言えるでしょう。平均的なサイズは、50MBです。90MB、またはそれ以上の場合は、重めな感じです。
仮に90MB以上となりそうな場合、サイズを減らすテクニックを調べたくなることでしょう。以下のようなテクニックがあります。:
- PDFやオーディオファイルのようなサイズの大きいアセットをasset storageへ移動させる。
-
.slugignore
経由で、不要な依存関係をリムーブし、不要なファイルを除外する。 - Rubyの場合は、:gitオプションを使い、ソースからgemをロードするのではなく、可能であればGemfileにgem名を指定し、参照を行う。