rbenvコマンドの利用方法 のラストにも登場しているように、
gem install bundler
で現在動作しているRubyにbundlerがインストールされる。
rbenv
を強制的に指定するには
rbenv exec gem install bundler
となる。
Bundlerとは
プロジェクト内で使うRubygemsを管理するしくみ。 プロジェクトの一番上のディレクトリに「Gemfile」というテキストファイルを置き、その中にgemの名前(と必要あればバージョンも)書く
Bundlerはカレントディレクトリ内にあるGemfile
を読み込み、必要なgemをバージョンを合わせてインストールしてくれるらしい。
bundlerをインストールして使う
Rubyのプラグイン、Gemは普通に使うとグローバルに入ってしまいます。 それを防ぐために特定ディレクトリに入れる仕組みがbundlerです。 今回はcocoapodsのインストールを例に記載します。
そしてbundlerでインストールするとグローバルではなく、プロジェクト毎に個別のパスにインストールすることができるらしい。
実際にGemfileを書いてみる。
bundle init
でGemfileのテンプレートを作成する書き始める前に、プロジェクトのカレントディレクトリで
bundle init
もしくは
rbenv exec bundle init
を実行するとGemfileのテンプレートが作成される。
# frozen_string_literal: true
source "https://rubygems.org"
# gem "rails"
source "https://rubygems.org"
Gemfile
のヘッダ部分にパッケージ取得先を指定する。
複数のsourceを指定することもできる。
Gemfile
に記述するgem 'nokogiri'
gem 'rails', '3.0.0.beta3'
gem 'rack', '>=1.0'
gem 'thin', '~>1.1'
といった具合。詳しくは Ruby STUDIO - Gemfileについて
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'
した。
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 exec をつけて実行します。 cocoapodの場合は pod ほげほげ で実行するので 以下の様な形で利用します。
$ bundle exec pod --version 0.39.0
bundle exec
というコマンドでgemを実行するとローカルインストールされたgemが実行される。
逆に通常どおりgem
とやってしまうとグローバルにインストールされたgemを参照しにいってしまう。