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コマンドでインストールしたようにシステムにインストールされてしまうので注意しよう。

results matching ""

    No results matching ""