📖

Bundlerってそもそも何?「なんとなく使う」から「理解して使う」ために色々と調べてみた

2 min read

bundle install実行中に、Your bundle is locked to mimemagic (0.3.3), but that version could not be found in any of the sources listed in your Gemfileというエラーが出ました。

Rails界隈で話題になっていたmimemagicのライセンス問題に関連するものと思われます。

それまでなんとなくbundle installを使っていて、Gemfile.lockが何をしているのか、などをちゃんと理解していませんでした。
そのため、色々とトライアンドエラーして、何だか腹落ちしないままなんとなく問題を解決した気になっていました。

これを機にBundlerをちゃんと学び、その内容をまとめておきたいと思います。

Bundlerとは

Bundlerとはアプリケーションを利用するgemパッケージを定義し、依存関係を解決するための仕組みです。
Bundlerはアプリケーションごとにgemパッケージの依存関係を閉じ込めることで、特定のアプリケーションでだけ利用するgemパッケージを簡単に管理することができます。
『パーフェクトRuby』 p.455

Bundlerを使うと開発プロジェクトごとにgemの依存関係を適切に管理してくれます。

Bundlerはgem install bundlerでインストールします。

bundle init

bundle initを実行すると、Gemfileというファイルが作成されます。

Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

このGemfileに使用するgemパッケージを列挙します。

バージョン指定は以下のように行います。

Gemfile
gem 'faker'  # バージョンはBundlerにおまかせ
gem 'nokogiri', '1.4.5' # バージョンは1.4.5に固定
gem 'mysql',    '>=2.8.1'  # 2.8.1かそれより新しいもの
gem 'sqlite3',  '~> 1.3.6' # 1.3.6以上、1.4未満で一番新しいもの

bundle install

bundle installを実行すると、Bundlerがgem同士の依存関係を適切に判断しながら記載されているgemと、それに関連するgemをインストールしてくれます。

以下のようなGemfileを書き、bundle installを実行してみます。

Gemfile
gem 'tapp'
gem 'faker'

bundle installを実行すると、Gemfile.lockというファイルが生成されます。

Gemfile.lockって何?

Gemfile.lockにはGemfileに記述されたgemパッケージの依存関係を解決した結果が書き出されます。
Gemfile.lockには依存するgemパッケージ名だけでなく、具体的なバージョンまで細かく記されます。

Gemfile.lock
GEM
  remote: https://rubygems.org/
  specs:
    concurrent-ruby (1.1.8)
    faker (2.17.0)
      i18n (>= 1.6, < 2)
    i18n (1.8.10)
      concurrent-ruby (~> 1.0)
    tapp (1.5.1)
      thor
    thor (1.1.0)

PLATFORMS
  x86_64-darwin-19

DEPENDENCIES
  faker
  tapp

BUNDLED WITH
   2.2.15

Gemfile.lockにはインストールするバージョンを固定する役割があります。
複数人で開発する場合、bundle installを実行するタイミングによってはgemのバージョンが異なってきてしまうかもしれません。

Gemfile.lockでバージョンを固定することで、複数人の開発でも同一のバージョンのgemパッケージを利用することができます。

bundle update

明示的に依存関係を再度更新してインストールしたいときにbundle updateを使います。

bundle installとの違いについて。

bundle installを実行すると、BundlerはGemfile.lockを元にgemのインストールを行います。
このときに

Gemfile.lockに記述されていない && Gemfileに記述されている

gemがある場合、そのgemとgemに関連するgemをインストールし、Gemfile.lockを更新します。

bundle updateを実行すると、BundlerはGemfileを元にgemのインストールを行います。
その後、Gemfile.lockを更新します。

bundle install と bundle updateの違いについて

GitHubで編集を提案

Discussion

ログインするとコメントできます