Help us understand the problem. What is going on with this article?

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

More than 3 years have 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/

dawn_628
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away