6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年9月22日 bundle installとbundle updateについて気になることをさらに深掘りました

※先日のブログ記事の内容を一部転載し補足しています。

bundle install と bundle updateの違い

bundlerをインストールすると、bundle installbundle 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 updateGemfileに記載されている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は破棄します。

参照

bundle updateで特定のgemのみ更新する

bundle update | Bundler日本語ドキュメント |

Ruby のバージョンアップで気をつけるべきこと