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に差異がある場合にエラー終了するかどうか以外に動作上の大きな違いはありません。

参考

関連記事

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833 コボラー、ITコンサル、ローカライズ業界を経てなぜかWeb開発者志願。 これまでにRuby on Rails チュートリアルの大半、Railsガイドのほぼすべてを翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ