bundler

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

More than 1 year has passed since last update.


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/