💡

bundlerとGemfileでRubyバージョンごとのgemを管理する方法

2022/06/04に公開

こんにちは、Masuyama です。

この記事では、rbenvbundler を用いて
Ruby バージョンごとに gem を管理し、使い分ける方法をご紹介します。


なお、本記事では Mac に rbenv をインストールしていることを前提としているので
まだ rbenv をインストールしていない方は、別記事をご参照ください。


補足として Gemfileでのバージョン指定方法や、
Gemfile.lock についての解説も付けているので、初心者の方にも分かりやすく解説しています。


では、本題に参りましょう。

bundler とは

bundler は**「gem の依存関係とバージョンを管理するためのツール」**です。


多くの開発環境では複数の gem を利用しますが、
個別の gem がまた別な gem を利用するというケースが多くあります。

しかも特定のバージョン以上の gem に依存している場合もあり、
こういった依存関係を自分で個別に解決するのは困難です。


このような場合に bundler を使うことで
gem の依存関係を解決しながら、必要な gem を一括でインストールすることができます。

bundler をインストール

では bundler をインストールします。

bundler は gem のためのツールではありますが
bundler 自体も gem ですので、gem install コマンドでインストールできます。

$ gem install bundler
$ rbenv rehash

bundler のインストールが終わったら、
バージョン確認コマンドに反応があることを確認しましょう。

$ bundler -v
Bundler version 2.3.9

bundler の設定

次の bundler の設定ファイル (Gemfile) の雛形を生成し、セットアップします。
(bundler のコマンドは bundle xx です)

$ bundle init
Writing new Gemfile to /Users/username/xxx/Gemfile

これを実行すると、現在のディレクトリ (/ruby_pj) 内に
Gemfile という設定ファイルが生成されます。


この Gemfile 内に、インストールしたい gem ライブラリを記載していくことになります。

初期状態では Gemfile は以下のようになっています。

Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

# gem "rails"

補足:Gemfileでのバージョン指定方法

なお、Gemfile 内の gem 情報の書き方に応じ、gem のバージョンを指定することができます。
以下に書き方の例を提示しておきます。

記法 インストールされるバージョン
gem 'rails' 最新のバージョン
gem 'rails', '6.0.0' バージョンを一意に指定 (6.0.0 を必ずインストールしようとする)
gem 'rails', '>= 6.0.0' 6.0.0 以上の最新
gem 'rails', '~> 6.0' 6.0 以上、7.0 未満の最新 (メジャーバージョンを維持)

今回の Gemfile のようにバージョン指定無しの場合は、常に最新版をインストールします。

Gemfileの編集

今回は Rails の 6.0 以上、かつ 7.0 未満の最新バージョンをインストールしてみましょう。

先述の通り、このような場合には ~> 記法を使います。

Gemfile

...
gem 'rails', '~> 6.0' # 元々の rails の記述は削除

bundler で gem をインストール

さて、これで bundler を用いて Rails をインストールする準備が整いました。

Gemfile の記載に沿って gem をインストールするには、bundle install コマンドを使用します。

$ bundle install --path=.bundle
...
Fetching rails 6.1.5
Installing rails 6.1.5
Bundle complete! 1 Gemfile dependency, 41 gems now installed.
Bundled gems are installed into `./.bundle`

上のように --path オプションを用いて
作業用ディレクトリ配下に gem ファイルをインストールすることがポイントです。
このオプションにより、gem は .bundle というディレクトリの中にインストールされます。



このオプションを付けないと rbenv で指定したバージョンの
Ruby そのものに紐付いて gem がインストールされてしまいます。

そうすると、同じバージョンの Ruby を利用している
他のプロジェクトがある場合には、予期せぬ影響を与えてしまうため注意しましょう。


これで Gemfile 内で唯一指定した通りのバージョンの
Rails がインストールされているはずです。

rails -v コマンドでバージョンを確認するのですが、
bundler を用いてインストールした gem は bundle exec コマンドで扱うのがポイントです。

$ bundle exec rails -v
Rails 6.1.5

補足:Gemfile.lock について

Gemfile を用いて Rails をインストールした際、
同じディレクトリ内に Gemfile.lock というファイルも生成されているはずです。

bundler では依存関係を解決しながら gem をインストールしてくれますが、
Gemfile に記載された gem のバージョンや依存関係を解決した結果を
Gemfile.lock というファイルに記録して保存してくれます。


なお、Gemfile.lock は bundler が自動で書き換えてくれるものなので、
特別な理由がない限り手動では書き換えないように注意しましょう。

補足:よく使われる bundle コマンド

他にもいくつかよく使う bundle コマンドがあるので、
既に紹介してものも含めて整理しておきます。

コマンド 実行結果
bundle init Gemfile を生成
bundle install Gemfile の記述に従い gem パッケージをインストール
bundle update [gem名] インストール済み gem のバージョンを更新
bundle list インストール済み gem の一覧を表示
bundle exec [コマンド名] bundler でインストールされた gem を仕様してコマンドを実行

Discussion