参考サイト

bundlerのインストール

rbenvコマンドの利用方法 のラストにも登場しているように、

gem install bundler

で現在動作しているRubyにbundlerがインストールされる。

rbenv を強制的に指定するには

rbenv exec gem install bundler

となる。

bundlerの動作

Bundlerとは

プロジェクト内で使うRubygemsを管理するしくみ。 プロジェクトの一番上のディレクトリに「Gemfile」というテキストファイルを置き、その中にgemの名前(と必要あればバージョンも)書く

Bundlerはカレントディレクトリ内にあるGemfileを読み込み、必要なgemをバージョンを合わせてインストールしてくれるらしい。

bundlerをインストールして使う

Rubyのプラグイン、Gemは普通に使うとグローバルに入ってしまいます。 それを防ぐために特定ディレクトリに入れる仕組みがbundlerです。 今回はcocoapodsのインストールを例に記載します。

そしてbundlerでインストールするとグローバルではなく、プロジェクト毎に個別のパスにインストールすることができるらしい。

Gemfileの書き方

実際にGemfileを書いてみる。

bundle initでGemfileのテンプレートを作成する

書き始める前に、プロジェクトのカレントディレクトリで

bundle init

もしくは

rbenv exec bundle init

を実行するとGemfileのテンプレートが作成される。

# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"

bundleのgemパッケージ取得先の指定

source "https://rubygems.org"

Gemfileのヘッダ部分にパッケージ取得先を指定する。 複数のsourceを指定することもできる。

必要なgemをGemfileに記述する

gem 'nokogiri'
gem 'rails', '3.0.0.beta3'
gem 'rack',  '>=1.0'
gem 'thin',  '~>1.1'

といった具合。詳しくは Ruby STUDIO - Gemfileについて

Bundlerを使ったgemのインストール

gemをインストール

% bundle install

Gemfile.lockが無い場合(はじめてbundle installした時) Gemfile.lockというファイルが生成される gemの名前とバージョンが列挙されている これをgitにcommitしておくと吉 Gemfileではゆるめにバージョン指定して、詳細はGemfile.lockに任せた方がいい

gemのインストール元

ローカルにないgemはrubygemsから最新版が ローカルにあるgemは、ローカルにある中で一番バージョン番号が大きいものがインストールされる

Gemfile.lockがある場合(2回目以降のbundle install時) 書いてあるバージョンのgemがインストールされる

この例では管理者権限で実行しているのでグローバルのRubyにgemがインストールされる。

Rails3からBundlerが導入されgemの管理がしやすくなりましたが、 色々なRailsアプリでほいほいbundle installを実行するとシステムにインストールされるgemが結構カオスになってきます。 また、Rails2とRails3が同居する開発環境だとかなり面倒くさくなります。精神衛生上あまり宜しくありません。

そこでbundlerにオプションを渡してgemを任意のディレクトリにインストールし、gemをRailsプロジェクト毎に管理することをオススメします。

と、いうことなので、localの任意のパスにインストールする方法がよさそうだ。

bundleで–pathと–binstubsが非推奨[DEPRECATED]になったよ

railsアプリを作る際、bundle initした後にやるおまじないがあります。

$ bundle install --path vendor/bundle --binstubs=vendor/bin
  • ローカルにgemをインストールするため –pathオプションでvendor/bundleを指定
  • bundle execを打ちたくないので –binstubsオプションでvendor/binを指定

いつものように上記のコマンドを打つと、以前は出なかった以下のメッセージが出るようになりました。

[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path 'vendor/bundle'`, and stop using this flag
[DEPRECATED] The --binstubs option will be removed in favor of `bundle binstubs`

–pathも–binstubsも非推奨 [DEPRECATED] となり、今後のバージョンからremovedされる可能性があるだと…。


どうすりゃいいのさ[vendor/bundle]

メッセージに書いてある通りに

bundle config set path 'vendor/bundle'

を一回やっとけばOKです。

と、最近 --path オプションが廃止されたので、プロジェクトディレクトリ直下で

bundle config set path 'vendor/bundle'

した。

gemをローカルにインストールする

Rails3の場合、使い方はこんな感じになります。

まず、プロジェクト用のディレクトリを作成し、Gemfileを記述します。

mkdir newapp
cd ./newapp
vim Gemfile

Gemfileにはrailsだけ指定します。

source "http://rubygems.org"
gem "rails", "3.0.1"

Gemfileを書き終わったらbundleコマンドを使いRailsをインストールします。ここではvendor/bundlerというディレクトリにgemをインストールします。

bundle install --path vendor/bundler
bundle install --path path

と記述することでローカルにgemがインストールされるようだ。

Gemfile に書いた内容をインストールします。 インストール先のディレクトリとしては メジャーな vendor/bundle を指定します。

$ bundle install --path vendor/bundle

pathの設定場所はvendor/bundleが一般的のようだ。 なので、インストールコマンドは

bundle install --path vendor/bundle

もしくは

rbenv exec bundle install --path vendor/bundle

と実行した。

bundleでインストールしたgemを利用する

実際に利用するときは頭に bundle exec をつけて実行します。 cocoapodの場合は pod ほげほげ で実行するので 以下の様な形で利用します。

$ bundle exec pod --version
0.39.0

bundle execというコマンドでgemを実行するとローカルインストールされたgemが実行される。

逆に通常どおりgemとやってしまうとグローバルにインストールされたgemを参照しにいってしまう。