2021年9月22日 bundle installとbundle updateについて気になることをさらに深掘りました
※先日のブログ記事の内容を一部転載し補足しています。
bundle install と bundle updateの違い
bundlerをインストールすると、bundle installとbundle updateのコマンドが使えるようになるのですが、「そもそもそれらのコマンドの違いって、何?」と思ったので、違いを以下に記述していきます。
bundle install
bundle installを実行すると、railsは、Gemfileを元にインストールを行います。(バージョンが指定されてないGemはGemfile.lockのバージョンを参照します) この時、Gemfile.lockに記述されていない、且つGemfileに記述されているGemがある場合、そのGemとそのGemに関連するGemをインストール後、Gemfile.lockを更新します。
↓bundle installでGemfile.lockにあるGemのバージョンを変更可能か否か気になったので実際に検証してみました。
上記のようにエラーが起こり更新に失敗します。 Gemのバージョンを変更をするにはbundle updateする必要があるとエラー文には出てきますが、以下のような問題点があります。
bundle update
bundle updateを実行すると、Bundlerは、Gemfileを元にgemのインストールを行います。その後、Gemfile.lock内に記載しているバージョンを無視して更新します。
bundle updateはGemfileに記載されているgemを全て、最新のバージョンに更新するので、アプリケーションが通常通り動かなくなってしまう場合があります。gemは相互に関係し合っており、最新のバージョンをインストールすることで、互換性が取れなくなることがあるからです。
※これはGemfileにバージョンを指定していない場合の話です。
ではGemfileでバージョン指定していない状態でGemfile.lockにあるGemのバージョン変更する場合はどうするのがいいのかと思い調べました
bundle install ではバージョン変更は行えないが、bundle updateには上記のリスクがあるため、以下のコマンドが重宝します。
$ bundle update [Gem名]
ただし、このコマンドには注意点があります。
それは入力したGemと依存関係のあるGemも更新してしまう点です。
これを解決し、指定したGemのみを更新した場合はconservative
オプションをつけると良いです。
$ bundle update --conservative [Gem名]
これでGemfile.lockにあるGemのバージョン変更を安全に行えます。 場面に応じて適切なコマンドを使用しましょう。
まとめ
コマンド | 説明 |
---|---|
bundle install | Gemfileにはあるが、Gemfile.lockに記載のないものをインストールします |
bundle update --conservative[Gem名] | 指定したGemのバージョンを更新します |
bundle update[Gem名] | 指定したGemと依存関係のあるGemを含めてバージョンを更新します |
bundle update | GemfileからGemfile.lockを生成します。 現行のGemfile.lockは破棄します。 |