Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Railsのbundle install --deploymentとは何なのか

こんにちは、hachi8833です。

160821_1400_FPCUPY

bundle install--deploymentオプションを付けると vendor/bundleにgemがインストールされますが、デプロイをインフラエンジニアにお願いしていると、このコマンドを使う機会が意外にないかもしれません。開発で普段使っている--path vendor/installオプションと何が違うのでしょうか。

GemfileとGemfile.lockの違い

Gemfileは、アプリケーションが使うgemを環境(development/test/production)に応じて指定するファイルです。そしてGemfile.lockは、bundle installbundle updateを行ったときに実際にインストールされたgemのバージョンを記録するファイルです。

gemのセットはサイズが大きいので、Gitに直接登録したりするとダウンロード/アップロードに時間がかかってしまいます。代わりにGemfileとGemfile.lockをGitに登録します。

なお、RMagickやImageMagickのように、システムにインストールされたライブラリにリンクするgemは基本的に実行先システムでコンパイルする必要があります。その都度コンパイルしたくないなら、VM Imageなどでシステムレベルで環境を揃えてバイナリをリポジトリに置くという方法も考えられます(その分portabilityが犠牲になりますが)。

bundle install –deployment

bundler公式ドキュメントのdeploymentオプションの説明 によると、deploymentモードは本番(またはCI)でのみ使用するものであり、developmentモードでオンにしてはならないとあります。

その理由には、先に述べたGemfile.lockが絡んできます。deploymentモードのbundlerは、Gemfile.lockだけを参照してgemをインストールします。そして、Gemfile.lockとGemfileで不一致があるとエラーで終了します。

--deploymentオプションでGemfile.lockだけを参照する理由は、Gemfileの内容でbundle installした結果が必ずしも一致するとは限らないからです。確実に動作するgemセットに一致するのはGemfile.lockなので、本番で何かの間違いでGemfileが更新されていたら、エラーで終了することでわかります。

なお、--deploymentオプションと--path vendor/bundleは、GemfileとGemfile.lockに差異がある場合にエラー終了するかどうか以外に動作上の大きな違いはありません。

参考

関連記事


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。