Skip to content
Latchkey

Bundlerとは何か - Rubyの依存関係マネージャーを解説

BundlerはRubyの依存関係マネージャーです。Gemfileを読み取り、一貫したgemバージョンのセットを解決し、それらをロックすることで、すべての環境が一致するようにします。

Bundlerは、プロジェクトに対して単一で一貫したgemバージョンのセットを解決し、それをlockfileに記録することで、Rubyの「依存関係地獄」を解決しました。RubyGems(個々のgemをインストールする)と連携して動作し、Rubyプロジェクトに再現可能な依存関係セットを提供します。

Bundlerとは

BundlerはRubyの依存関係マネージャーです。プロジェクトに必要なgemをGemfileにリストアップすると、Bundlerが相互に互換性のあるバージョンを解決し、インストールし、解決された正確なセットをGemfile.lockに記録します。「bundle exec」コマンドは、まさにそれらのバージョンを使ってツールを実行します。

動作の仕組み

BundlerはGemfileを読み取り、互換性のある依存関係グラフを解決し、正確なバージョンをGemfile.lockに書き込みます。「bundle install」がそれらをインストールし、Gemfile.lockをコミットすることで、すべてのマシンとCI runnerが同一のセットをインストールするようになります。「bundle exec rspec」はそれら解決されたgemのコンテキストでコマンドを実行し、システムgemとのバージョン競合を回避します。

使用例

gemを宣言し、インストールし、bundle内で実行します。

Gemfile plus Bundler commands
# Gemfile
source "https://rubygems.org"
gem "rails", "~> 7.1"

# install and run a tool with the locked versions
bundle install
bundle exec rspec

CI/CDでの役割

pipelineでは、「bundle install」がロックされたgemセットを復元し、「bundle exec」が正しいバージョンでテストやタスクを実行します。「bundle config set frozen true」を設定すると、lockfileが変更されるような場合にCIが失敗するようになり、ドリフトを検出できます。インストール済みのgem(vendor/bundleパス)を実行間でcacheすることで、変更のないgemの再インストールを避け、jobを高速化できます。

代替手段

RubyGems単体ではgemをインストールできますが、プロジェクト全体で一貫したセットを解決することはできません。そのためBundlerがその上に存在します。Rubyの世界にはBundlerに対する主流の競合は存在せず、事実上アプリケーションの依存関係管理の標準となっています。

重要なポイント

  • Bundlerは一貫したRuby gemバージョンのセットを解決してロックします。
  • Gemfileが依存関係を宣言し、Gemfile.lockが解決されたセットを固定します。
  • CIではfrozenインストールとgemのcacheを使うことで、再現可能で高速なbuildを実現します。

関連ガイド