8.2 Bundlerの概要と使い方
Bundlerはgemをプロジェクトごとに管理するためのツールである。具体的には、プロジェクトを置いているディレクトリ以下にgemをインストールしてプロジェクト内でのみそのパッケージを使えるようにするというものである。
RubyGems単体でgemを管理するときの問題点として、依存関係の衝突が挙げられる。例えば次のような状態のとき、プロジェクト単位でのgemの管理が役に立つ。
パッケージA、BともにパッケージCに依存しているが、それぞれ別のバージョンと依存しているので、AとBは同じ環境に共存できない。このとき、AとBは依存関係の衝突を起こしているという。このとき、サービスXとYも同じ環境に共存できないことになるので、非常に不便である。ここで問題なのは、gemがインストールされる先が一つしかないのでCを一つのバージョンしかインストールできないことだ。そこで、Bundlerを使ってそれぞれのプロジェクト上に必要なパッケージをインストールすると、AとBは依存関係の衝突を起こさないので、XとYは同じ環境に共存できる。
Bundlerを使うことで環境のgemの依存状態に左右されずにプロジェクトに必要なgemをインストールできるようになるので、他人の環境でプロジェクトの動作環境を再現する事も容易になる。なので、ある環境では動作するのに別のある環境では動作しない、という状況が起こりづらくなる事もBundlerの利用をするべき理由の一つである。
Bundlerのインストールをするには以下のコマンドを実行すればよい。
sudo gem install bundler
このコマンドでbundlerコマンドとbundleコマンドの二つのコマンド名でインストールされるが、どちらも全く同じ振る舞いをするのでどちらを使っても良い。Web上の資料ではbundleの方を使っている場合が多く、この資料でもbundleの方で説明していく。また、インストールするコマンドから分かるが、Bundlerはgemの一つである。RubyGemsはRubyのコード上で使うライブラリ以外にもBundlerのようなコマンドのパッケージも管理している。
Bundlerを使ってプロジェクトごとにgemを管理する時には、まずBundlerの設定ファイルを作成しなければならない。
bundle init
このコマンドを実行するとカレントディレクトリにGemfileという名前のテキストファイルが生成される。このファイルにプロジェクトで使いたいgemを書いて、その後にbundleコマンドでプロジェクトに組み込むという流れになる。
では実際にGemfileを書いてみよう。今回は8.1で紹介したTitleizeパッケージをプロジェクトで使用できるように設定してみる。
# gemを取得するURL
source "https://rubygems.org"
# インストールするgem
gem "titleize"
Gemfileが書けたらgemをインストールする。
bundle install --path ./vendor/bundle
pathオプションでgemをインストールするディレクトリを指定している。pathを指定しない場合にはgemコマンドでインストールしたようにシステムにインストールされてしまうので注意しよう。