いづいづブログ

アジャイルコーチになりたい札幌在住SEです。アジャイル札幌スタッフ&ScrumFestSapporo実行委員。Like:パクチー/激辛/牡蠣/猫/初期仏教

Bundlerとは

f:id:izumii-19:20190509125243p:plain:w500

gemをインストールするときにはBundlerを使うらしいのでBundlerについてまとめました。

毎日勉強していると知らないことが多すぎて悲しくなります。

前書き

"gem"というと

  1. Ruby言語用のライブラリ
  2. RubyGemsというパッケージ管理システムをインストールすると使えるようになるコマンド

の大きく2種類の意味で使われることが多いので、このエントリーでは以下のように使い分ける。

  1. Ruby言語用のライブラリ ⇒ gem
  2. RubyGemsというパッケージ管理システムをインストールすると使えるようになるコマンド*1 ⇒ gemコマンド

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

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

橋本商会 » Ruby書くならBundler使え

*1:Ruby のバージョン 1.9 以降 RubyGems は標準添付となっているので最近だとわざわざインストールとかしない。