bundler、bundle execについて　※自分用メモ

# bundler公式サイト
http://bundler.io/

# bundlerとは
プロジェクト内で使うGemのパッケージ管理ツール。
Bundlerを利用することで，アプリケーション単位でgemを管理できる。

大雑把に言えば、rbenvと似たようなもの。
・rbenvはプロジェクトごとにRubyのバージョンを管理する。
・bundlerもプロジェクトごと(bundle install --path vendor/bundleすることにより)にGemを管理できる。
Ruby 自体のバージョンは、プロジェクト毎に rbenv で管理する。
gem のバージョンは、プロジェクト毎に Bundler で管理する。

# bundlerでできること
Gemfileというファイルにパッケージ名、バージョンを記述してgemのライブラリを管理出来ます。
また、グループ化などもでき、環境に応じてgemを管理することができます。
bundlerを使うと、Ruby の gem をプロジェクト毎に管理できる。
また、開発チームのメンバー間で環境構築の際に どのバージョンの gem をインストールするかを Bundler に任せることができます。bundler は、プロジェクトに必要なGemを「プロジェクト毎」にインストール、及び管理が出来る、というイメージです。

Bundlerを利用することで，アプリケーション単位でgemを管理することができます。即ち、システム側にはgemはインストールせず，アプリケーションディレクトリにインストールするという方法です。この方法だとファイルの冗長性が増すので，サイズも無駄にとることになりますが，システムに依存しませんので，アプリケーション内でのgemのバージョンの整合性の問題は無くなります。

# bundle installについて

参考サイト
http://qiita.com/hisonl/items/162f70e612e8e96dba50
http://shokai.org/blog/archives/7262
http://blog.tokoyax.com/entry/ruby/bundler
https://tamosblog.wordpress.com/2011/11/14/ruby_env_by_bundler/
http://qiita.com/h5y1m141@github/items/74029cab9706971c8dbe

# bundle installの方法は2通り
1. bundle install (--system) ※システム全体(rbenv利用下の場合、/Users/ユーザー名/.rbenv/versions/バージョン名/lib/ruby/gems/...以下にインストールされる。)にインストールされる。Mac PCにインストールされる。
2. bundle install --path vendor/bundle  

構文：bundle install --path <フォルダ名>
※プロジェクト(そのアプリケーションの中だけ)にインストール
※「1」 のやり方(bundle installのみ)でシステムにインストールして複数のプロジェクトを作成していると、Gemのバージョンの競合が発生するので、インストールは「2」の「bundle install --path vendor/bundle」で行う。

bundle install --without production　※本番用のgemはローカル環境にインストールされない．

※「1」のbundle installについて
単純に bundle installと実行されると、rbenv利用下の場合、/Users/ユーザー名/.rbenv/versions/バージョン名/lib/ruby/gems/...以下にインストールされる。
bundle install --path <フォルダ名>
とすれば、指定のフォルダにインストール先を指定できる。
たとえば、
「2」の、bundle install --path vendor/bundle
と記述すると、railsアプリのルートディレクトリの下のvendor/bundleディレクトリにインストールされ、そのアプリケーションの中だけにインストールされる。
一度上のコマンドを実行すれば、Bundlerはインストール先を記憶するので次回以降は
bundle install
を実行するだけで毎回vendor/bundleディレクトリにインストールされる。
因みに、Bundlerはgemのインストール先を、railsアプリのルートディレクトリの下の、「.bundle/config」というファイルで記憶している。コマンド「cat .bundle/config」で中身を見れる。
個別のRailsアプリにインストールされているgemの一覧を見るには以下のコマンドを使う。
bundle list

# 間違えてRuby環境の方にいろんなGemが入ってしまった場合の対処
参考サイト
http://qiita.com/emadurandal/items/a60886152a4c99ce1017#%E9%96%93%E9%81%95%E3%81%88%E3%81%A6ruby%E7%92%B0%E5%A2%83%E3%81%AE%E6%96%B9%E3%81%AB%E3%81%84%E3%82%8D%E3%82%93%E3%81%AAgem%E3%81%8C%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6
以下で全てのgemをアンインストールする。その後、標準でインストールされていたgemやbundlerを入れ直すこと。

rbenv exec gem list | awk '{print "rbenv exec gem uninstall " $1}' | sh -xv
あるいは、以下の方法でRuby環境ごと削除して、rubyを導入しなおしても良い。
不要になったバージョンのRuby環境を削除する
rbenv uninstall -f 2.0.0-p195
rbenv rehash


installしたgemはGemfile.lockでバージョンが固定される. それを無視して最新のgemを取得するにはupdateを利用する。但し、うかつにbundle updateは行わない。

$ bundle update # システム
$ bundle update --path vendor/bundle # プロジェクト
$ bundle update nokogiri # 個別にGemをupdate、nokogiri gem only

# bundle execについて
bundle exec # Bundlerでインストールされたgemパッケージを使用してコマンドを実行する。プロジェクトのGemを指定したことになる。現在いるプロジェクト内でコマンドを叩くことになる。bundle exec... なしで、 rake xxxとかすると、システム共通の場所をフィールドにコマンドが実行される。

### ※ bundlerを使う場合は、コマンドの先頭に、「bundle exec」を付ける。これをやらないと、システム側のgemを指定したことになります。システム共通の場所をフィールドにコマンドが実行される。

以下のようにバージョンが異なるので違いが分かると思います．
$ rake --version　# システムの中のバージョン
rake, version 0.8.7
$ bundle exec rake --version　# プロジェクト(そのアプリケーションの中)のバージョン
rake, version 0.9.2.2

※備考
bundle execは、Bundlerでインストールされたgemパッケージを使用してコマンドを実行。
bundlerを使うならbundle execは必須(エイリアスは設定できる)
bundlerで指定したgemを使う（実行時に指定）
今まで
ruby foo.rb
rackup config.ru 等で実行していたのを、

bundlerを導入した場合は、
bundle exec ruby foo.rb
bundle exec rackup config.ru とする

※以下、参考用のコマンド
bundle -v # bundlerのバージョンを確認
bundle init # Gemfileを生成
bundle exec rails new ~
bundle exec rails s
bundle exec rake db:migrate
bundle exec rake db:create
bundle exec rake db:seed
bundle exec rake test
bundle list　※個別のRailsアプリにインストールされているgemの一覧を見る
which ruby # which、コマンドのフルパスを表示。どこにRubyがインストールされたか確認
which gem # which、コマンドのフルパスを表示。どこにGemがインストールされたか確認
gem env # 現在使っているRubyのパス、Rubyが参照しているgemのパスを確認
gem list # システム(ローカル)にインストール済みのgemを確認
bundle list # プロジェクトにインストール済みのGemを確認。bundlerでインストール済みのgemを確認
gem update # システム側のgemをアップデート

## bundlerでインストールしたGemを確認
bundle install --path vendor/bundle # を実行後、次の ls コマンドなどを実行 ↓
ls vendor/bundle/ruby/1.9.1/gems/ # 実際にインストールされたかどうか確認
du -sh vendor/bundle # サイズを確認
cat .bundle/config
### ※「cat .bundle/config」コマンドについて
ここの「BUNDLE_DISABLE_SHARED_GEMS」の値が「1」の時は，システムにインストールしたgemsは使わないという設定になります．つまりシステムのgemには依存しないというか関わりをもたないということになり，アプリケーションの独立性が確保されます。


参考サイト
http://bundler.io/v1.0/bundle_install.html

http://komaken.me/blog/2013/07/05/%E9%A0%AD%E3%81%8C%E5%BC%B1%E3%81%99%E3%81%8E%E3%81%A6ruby-rbenv-gem-bundle-rails%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%8C%E7%90%86%E8%A7%A3%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%BB/