こんにちは、hachi8833です。
bundle install
に--deployment
オプションを付けると vendor/bundle
にgemがインストールされますが、デプロイをインフラエンジニアにお願いしていると、このコマンドを使う機会が意外にないかもしれません。開発で普段使っている--path vendor/install
オプションと何が違うのでしょうか。
GemfileとGemfile.lockの違い
Gemfileは、アプリケーションが使うgemを環境(development/test/production)に応じて指定するファイルです。そしてGemfile.lockは、bundle install
やbundle 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に差異がある場合にエラー終了するかどうか以外に動作上の大きな違いはありません。
参考
関連記事
- ちょっと待った! Railsでgitリポジトリから除外すべきでないファイル:Gemfile.lockとdb/schema.rb
- 【翻訳+解説】binstubをしっかり理解する: RubyGems、rbenv、bundlerの挙動
- Rails3アプリケーション開発で良く使うgemまとめ