Skip to content
iwhurtafly edited this page Oct 16, 2012 · 3 revisions

slugとは、圧縮され、事前にパッケージされたアプリケーションのコピーのことです。 アプリケーションは、dyno manifoldを経由し、高速なディストリビューションを可能とするために 最適化されています。Herokuへgit pushする際、slug compilerがコードを受け取り、リポジトリをslugへ変換します。 その後で、アプリケーションのスケーリングが行われ、実行のためにslugをダウンロードし、dynoへと展開します。

コンパイル

slug compilerは、git pre-receive hookにより呼び出され、以下のステップで実行されます。:

  1. マスターブランチから新規のHEADのチェックアウトを作成します。

  2. .gitディレクトリ、logtmpにある全ファイル、最上位の.slugignoreに指定された全ファイルを含めた未使用のファイルをリムーブします。

  3. ダウンロード後、ビルドし、さらにビルドファイル(例えば、Gemfilepackage.jsonrequirements.txtpom.xml等)に指定されたローカルの依存関係をインストールします。その際、プログラミング言語毎にサポートされている依存関係のマネージメントツール(例:Bundler、 npm、 pip、 Maven)を使用します。

  4. 最終的なslugのアーカイブをパッケージ化します。

.slugignoreを使い不要なファイルを除外する方法

アプリを実行する上で不要なファイルがリポジトリに含まれている場合、リポジトリのルートに存在する.slugignoreへ、これらのファイルの情報を追加したくなることでしょう。slugから除外するファイルとして、例えば以下のようなものがあります。:

  • 単体テスト または、単体仕様
  • アート系のソース(.psdファイルのような)
  • デザイン系のドキュメント(.pdfファイルのような)
  • テストデータ

フォーマットに関しては、!の否定演算子をサポートしていないことを除けば、ほぼ.gitignoreに近い形式です。以下、.slugignoreの例となります。:

:::text
*.psd
*.pdf
test
spec

.slugignoreファイルは、このファイルに記載されたものとマッチしたアセットを最終的なslugに含めないことを保証します。 これらのアセットは、.slugignoreファイルに記載する前は、アプリケーションをディプロイした際に、Herokuへプッシュされていたこととなります。

gitにより追跡されないことを確約することで、さらに不要なファイル(例えば、logtmpのディレクトリ)を減らすことが可能です。この場合、これらのファイルはHerokuへディプロイされることはありません。.gitignore ファイルの使い方を参照して下さい。

slugのサイズ

コンパイル成功時、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名を指定し、参照を行う。
Clone this wiki locally