みなさんこんにちは!
今回の記事は、

・bundle installの役割が知りたい!
・bundle installとbundle updateの違いってなに?
というお悩みを解決する記事になっています。
・bundleの意味
・bundle installの役割
・bundle updateの役割
・bundle installとbundle updateの違い
・bundle installとbundle updateの使い分け方
Railsを使って開発を進める中で、”bundle install” と”bundle update” を実行することが多々あると思います。
しかし、「その両者の違いは?」と聞かれると、すぐには回答できない方も多いのではないでしょうか?
Railsでの開発にはGemが必須であり、そのGemの管理のためには「bundle」コマンドに関する知識が不可欠になります。
本記事を通じて「bundle」コマンドに関する知識を深め、適切なGem管理を心がけていきましょう!
フリーランス案件を探すならこのエージェント!
転職を考えているならこのエージェント!
そもそも、bundleってなに?
“bundle install” と”bundle update” の違いについてご説明する前に、まずはその”bundle”の正体についてご紹介しますね。
“bundle“とはBundlerというGemが実行するコマンドであり、このコマンドによってアプリケーション全体のGemを管理することが可能となります。
通常、Railsでアプリケーションを開発する際には、複数のgemを使用することになります。
この時、「gemAのver1.0とgemBのver1.0を組み合わせたらうまく動くけど、ver2.0同士だとうまく動かない。」とか、「CさんとDさんの開発環境でgemAのバージョンが合っていない」などの問題が発生することがあります。
そうした状況下で、gem同士の互換性を保ちながらバージョンを調整し、各gemの導入・管理を担ってくれるのが
Bundlerになります。
bundle installの役割
それでは、”bundle install” を実行することで具体的には何をどうすることが可能になるのでしょうか?
“bundle install” を実行することによって、RailsはGemfile.lockを元にGemをインストールしていきます。
この時、Gemfileには記載されているもののGemfile.lockに記載されていないGemがある場合には、そのGemとそのGemに関連するGemをインストールした後、Gemfile.lockを更新することとなります。
ここで、新たに登場したGemfileとGemfile.lockについて少しご説明させていただきます。
Gemfileとは
Gemfileとは、Railsプロジェクトで使用するGemを管理する「管理簿」のようなものであり、新たに必要となったGemがある場合には、このGemfileに以下のように追記していきます。
gem 'devise'
Gemfile.lockとは
一方、Gemfile.lockは、”bundle install” や “bundle update” を実行したことで実際にインストールされたGemを記載したものです。
ここで「実際にインストールされた」と強調したことには意味があります。
一口にGemとは言っても、Gemがそれ単体で成り立っていることは少なく、多くのGemが他のGemを使用している(つまり、Gem同士が関連しあっている)ことが多いのです。
例えば、Gem1はその内部でGem2とGem3を使用しており、Gem3はその内部でGem4を使用している場合、Gem1はGem2とGem3、そしてGem4と関連している、ということになりますね。
GemfileとGemfile.lockの関係性
以上を踏まえると、GemfileとGemfile.lockの関係性は以下の通りになります。
ファイル | 用途 |
---|---|
Gemfile | Railsプロジェクトで導入するGemのみを記載する |
Gemfile.lock | Gemfileに記載した「Railsプロジェクトで導入するGem」を使用するために必要な(=関連している)他のGemも含めて、インストールされた全てのGemを記載する |
【まとめ】bundle installがすること
以上を踏まえると、”bundle install” の役割は以下のようになります。
- Gemfile.lockに記載されているGemをインストールする
- GemfileとGemfile.lockを比べ、Gemfileに記載されているもののGemfile.lockに記載されていないGemがあれば、そのGemと関連するGem全てををインストールする
- 上記1, 2でインストールしたGemを踏まえてGemfile.lockを更新する
bundle updateの役割
続いて”bundle update” の役割を見ていきましょう。
簡潔にはなりますが、”bundle install” と同様の形でまとめると以下のようになります。
- Gemfileに記載されているGemをインストールする
- 上記1でインストールしたGemを踏まえてGemfile.lockを更新する
bundle installとbundle updateの違い
ここまで”bundle install” と”bundle update” それぞれの役割について見てきましたが、それらを踏まえると、両者の主な違いは以下の通りです。
コマンド | 役割 |
---|---|
bundle install | Gemfile.lockに記載されているGemをインストールする |
bundle update | Gemfileに記載されているGemをインストールする |
これだけでは分かりづらいため、具体例を出してご説明していきますね。
例えば、現時点で”devise” というGemを既にインストールしている(Gemfileに 「gem ‘devise’, ‘2.0.0’」という記載があり、既に一度 “bundle install” を実行している)こととします。
その後、Gemのバージョンを変更(Gemfileを「gem ‘devise’, ‘4.0.0’」という記載に変更)した場合、それぞれのコマンドを実行した結果は以下の通りになります。
コマンド | 結果 |
---|---|
bundle install | ・2.0.0バージョンのdeviseがインストールされる ※既存のGemについては、Gemfileの変更はGemfile.lockには反映されず、Gemfile.lockに記載されているバージョン(2.0.0)をそのままインストールするため |
bundle update | ・4.0.0バージョンのdeviseがインストールされる ※Gemfileに記載されているバージョン(4.0.0)をインストールするため |
bundle updateでbundle intallがカバーできるのでは?
以上を踏まえると、バージョンを変更する時だけでなく、新しくGemを導入した時も“bundle update” だけで十分なのではないかと思われる方も多いのではないでしょうか。
しかしここで一つ注意しておくべきことがあります。
それは、”bundle update” を実行すると「バージョンを変更したいGem以外のGemのバージョンも変更してしまう」ということです。
本記事の最初の方でご説明した通り、Gemというのはそれ単体で成り立っているものは少なく、他のGemを使用している(関連し合っている)Gemも多く存在しています。
そのため、”bundle update” を実行すると意図しないGemのバージョンも変更されてしまい、それによって思わぬところでシステムが動かなくなってしまう(バグが発生してしまう)恐れが出てきてしまうのです。
もちろん、古いGemを使用していてはセキュリティリスクを上げてしまうことになるため、定期的に”bundle update” を実行することは必要となりますが、それは「Gem全体をアップデートする」というタスクの際に実行するようにしましょう。
新しくGemを導入する際にはそのGemとそのGemに関連するGemのみを追加する(他の既存のGemには影響を与えない)ようにし、不要なトラブルは避けるようにしたいですね。
【結論】bundle installとbundle updateはこう使い分ける
ここまでを踏まえると、両者の使い分けはズバリ以下の通りとなります。
コマンド | 結果 |
---|---|
bundle install | Gemfileに新たにGemを追加したり、或いはGemfileからGemを削除した場合に実行する |
bundle update | Gemfileに記載されているGemのバージョンを変更した場合に実行する |
お仕事の途中ですが、少し一休みして、転職や独立について考えてみませんか🙌?
現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】
レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】
MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】
日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲
最後に
ここまで、”bundle install” と”bundle update” の違いについてご説明してきましたがいかがでしたか?
両者を曖昧なまま使用されている方も多いかと思いますが、両者を混在してしまうと不要なバグを生んでしまうこともあるため、その違いをしっかりと把握しておきましょうね。
このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。
最後まで読んで頂きありがとうございました。