Life is what you make it.

Actions speak louder than words.

雰囲気で使っていたbundlerについて調べた

プロジェクトのバージョンアップ作業に伴い、bundleについて理解を深めるために公式ドキュメントを確認してみた。 bundler.io

Bundlerとは?

Bundlerは、必要なgemとバージョンを正確に追跡してインストールすることで、Rubyプロジェクトに一貫した環境を提供します。 Bundlerは依存性地獄からの出口であり、必要なgemが開発、ステージング、本番環境に存在することを保証します。 プロジェクトでの作業の開始は、bundle installと同じくらい簡単です。

Bundlerを使用する事で下記のようなメリットが生まれる。

  • プロジェクトを始める際や新しいメンバーが参加する際、bundle install コマンドを実行することで、すぐに必要なgemをインストールできる。
  • Gemfile.lockを生成し、インストールされたgemのバージョンをロックすることで、開発者全員が同じバージョンのgemを使用することが保証され、バージョンの不整合による問題を防ぐことができる。

bundle install

Gemfileで指定された gem をインストールする。

公式に下記の重要な記述があった。 Gemfile.lockとの関係性がしっかりと記載されていた。この辺り曖昧だったのでちゃんと理解しないと。

bundle install を初めて実行する場合 (Gemfile.lock が存在しない場合)は、 依存関係を解決して必要な gem をすべてインストールする。

Gemfile.lock が存在し、Gemfileを更新していない場合は、 Gemfile.lock で指定された依存関係を使用する。

Gemfile.lockが存在し、Gemfileを更新した場合は、 BundlerはGemfile.lockの依存関係を更新していないすべてのgemに使用するが、更新したgemの依存関係を再解決する。 つまり、変更のないgemはそのままで、更新されたgemだけが再解決されて新しいバージョンがインストールされる。

bundle update

Gemfile.lock内に記載されたgemのバージョンを無視して、指定されたgemを更新する。 (--allフラグが使用されている場合はすべてのgem) 一般的に、マシン間で全く同じgemとバージョンをインストールするにはbundle installを使う。

ただし、gemのバージョンを明示的に更新するにはbundle updateを使うべきとのこと。

bundle installとbundle updateの違い

整理すると、 bundle installはGemfile.lockに基づき依存関係をインストールする。Gemfileを更新していれば、更新されたgemだけが再解決されて新しいバージョンがインストールされる。 bundle updateは既存のGemfile.lockを更新して最新の状態にする。

bundle installはGemfileに記載された依存関係をインストールしたいときに、bundle updateは特定のgemをバージョンアップさせたいときに使う。

といことになると思う。

最近業務でよく使ったコマンドの整理

bundle info [GEM_NAME]

指定したgemのバージョンを表示する。

$ bundle info rails
  * rails (7.1.4)
        Summary: Full-stack web application framework.
        Homepage: https://rubyonrails.org...

bundle list

bundle内のgemの一覧を表示する。

$ bundle list
Gems included by the bundle:
  * actioncable (7.1.4)
  * actionmailbox (7.1.4)
  * bigdecimal (3.1.8)
  * bindex (0.8.1)
  * bootsnap (1.18.4) ...

bundle version

Bundlerのバージョンを表示する。

$ bundle version
Bundler version 2.5.19 

bundle outdated

インストールされているgemの利用可能な最新のバージョンを表示する。 現バージョンと最新バージョンを表形式で見やすく表示してくれる。バージョンアップ作業をするときに必須のコマンド。

$ bundle outdated
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Gem                   Current  Latest  Requested  Groups
actioncable           7.1.4    8.0.1
actionmailbox         7.1.4    8.0.1
actionmailer          7.1.4    8.0.1
...

bundleコマンドとgemfileとの関係性やinstallとupdateの違いが曖昧だったので調査して理解が深まった。

おわり。