Bundlerとは
gemをインストールするときにはBundlerを使うらしいのでBundlerについてまとめました。
毎日勉強していると知らないことが多すぎて悲しくなります。
前書き
"gem"というと
の大きく2種類の意味で使われることが多いので、このエントリーでは以下のように使い分ける。
gemコマンド
gem install
コマンドを使うとgemをインストールすることができる。(アンインストールはgem uninstall { gem名 }
。
$ gem install "sinatra"
これ以外にもgemコマンドを使用するとgemに対する様々な操作ができるがここでは割愛する。
gemの依存関係
Bundlerの話の前にgemの依存関係について。
gemの中には依存関係があるものがある。例えば、
- Aというgemを使うにはBというgemのVer1.0を使う必要がある
- BというgemのVer1.0はCというgemのVer3.0を使う必要がある
- BというgemにはVer1.0とVer2.0があるが、BをVer2.0にしてしまうとAは動かない
とこんな感じに。
チームで開発している場合、誰か一人だけバージョンをあげたりすると開発しているプロダクトがうまくうごかなくなる可能性もあるのでチーム内で合わせておく必要がある。
ところが、gem install
を使用してgemをインストールする場合、こういった依存関係を把握した上で必要なgemを入れていく必要がある。
もう、間違いが起きる予感しかない。
Bundler
ここでBundlerの登場。
gem間の依存関係を解決しながら必要なgemを一括でインストールできる仕組みのこと。
簡単に説明すると「"Gemfile"というファイルを作成してそこに指定されているgemをインストールする」といったことができるのだが、後述するGemfile.lockのおかげでけっこう柔軟にバージョン管理ができて便利。
ちなみにBundlerもgemの1つ。
インストール
BundlerはBundlerでインストールできないので、ここはgemコマンドを使ってインストールする。
$ gem install bundler
インストールしたら下記のコマンドで最新バージョンが入っていることを確認すること。
$ bundler -v
Gemfileを作成する
Gemfileはインストールしたいgemを書いておくファイル。
以下のコマンドを実行するとGemfileの雛形が作成されるので出力された雛形にgemの情報を記述していく(編集はvimなどのエディタでやる)。
$ bundle init
書く内容はざっくりとこんな感じ。
source "https://rubygems.org" # gemインストール元 ruby "1.9.3" # Rubyのバージョン gem "nokogiri" # インストールするgemを指定 gem "RedCloth", ">= 4.1.0", "< 4.2.0" # バージョンを指定することもできる gem "rspec", :group => :test # こんな指定もできるっぽい …
記述方法はBundler本家のサイトに書いてるので割愛。
bundle install
作成されたGemfileをもとにgemのインストールを実行する。
$ bundle install --path {ディレクトリ名}
--path
でインストール先を指定することが可能。
一度path指定でインストールすると、次回以降はpath指定無しでも同じpathが選択される。この時Gemfileがある場所と同じところに"Gemfile.lock"というファイルが作成される(初回のみ)。
Gemfile.lockについて
Gemfile.lockにはインストールしたgemの名前とバージョンが記載されている。
実はbundle instarll
を実行するときには、このGemfile.lockファイルがある場合とない場合で挙動が少し違う。
Gemfile.lockがない場合(初回実行時)
インストールしたgemの名前とバージョンをGemfile.lockに出力する。
Gemfile.lockがある場合(2回目以降) Gemfile.lockにかかれているバージョンのgemがインストールされる。Gemfile.lockは更新されない。
この仕組をうまく利用し、Gemfile.lockをチーム内に配布してbundle install
するようにすれば、他の端末でも同様の環境が用意できる。便利!
Gemfileではバージョン指定はゆるめにしておき、gemのバージョン管理はGemfile.lockに任せるというやりかたがよさそう(その場合はGemfile.lock をGitに登録しておくといいかも)。
bundle update
bundle updateは、rubygems.orgから最新版を取得しGemfile.lockを更新する。gemのバージョンを更新したい時に使用する。
まとめ
gemのインストールはgemコマンドではなくBundlerでやろう!
参考
Bundler: The best way to manage a Ruby application's gems