mainvisual

bundlerの公式サイトはhttp://bundler.io

自分はReilsを使って、apiとかサイトとかをテスト用としてちょくちょく作るのですが、bundlerの仕組みとか、railsのvenderファイルの役割とかしっかりわかっていなかったので、調査しまとめることにした

bundle ってそもそも何?

公式サイトより Bundler provides a consistent environment for Ruby projects by tracking and installing the exact gems and versions that are needed. (Bundler は Ruby製のプロジェクトの開発においてgemバージョンなどの情報の一貫性のある環境を提供しまうす。) Bundler is an exit from dependency hell, and ensures that the gems you need are present in development, staging, and production. Starting work on a project is as simple as bundle install. (Bundler は依存関係の地獄から脱出し、開発やステージング、その生産において必要としています。プロジェクトへのインストールは簡単です。)

っていうようなことを言っています。 要は、gem を プロジェクト毎に管理できるツールのことです。

なぜ、Bundlerを使うのか

今まで、ローカルでRuby製のライブラリを使おうと思ったとき、gem install [package name]と、グローバルインストールしていました ところが、それではグローバルインストールには管理者権限が必要であったり、複数のバージョンがインストールされたりといった、あまり好ましくない状態がありました。

ここで、Bundleを使うと、プロジェクトごとにパッケージを管理でき、そのフォルダ内でのみ有効のライブラリをインストールできるようになったわけです。

グローバルインストールとローカルインストール

グローバルインストール * gemでコマンドをインストールするとき * 最新の機能が付いているとき

ローカルインストール * 基本的にことらを採用してインストールする * プロジェクト毎でバージョンが違うとき

Bundler インストール

k4zzk@MacBook-Pro ~ (master %) » gem install bundler
Successfully installed bundler-1.10.6
Parsing documentation for bundler-1.10.6
Done installing documentation for bundler after 3 seconds
1 gem installed

これで「Gemfile」に書かれたGemパッケージと、そのGemパッケージが依存しているGemパッケージを自動的に調べて全てインストールしてくれます。

よく使うBundlernのサブコマンド

コマンド 説明
Bundle init Gemfileを生成する
bundle install Gemfileに書かれたgemの情報に従ってインストール
bundle exec Bundlerでインストールされたgemパッケージを利用してコマンドを実行 (パッケージ毎にインストールされたものも含む)
bundle list インストール済みのgemパッケージ一覧を表示
bundle update インストール済みのgemパッケージを更新

Gemパッケージの保存先

おもむろに、Gemfileがあるディレクトリで

bundle install

を実行すると、どこかにインストールされるのですが、その場所は環境によって違います。

gem env

でどこにgemがあるのかがわかります。 私の場合、

k4zzk@MacBook-Pro ~ » gem env
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14
  - RUBY VERSION: 2.0.0 (2014-05-08 patchlevel 481) [universal.x86_64-darwin14]
  - INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.0.0
  - RUBY EXECUTABLE: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - universal-darwin-14
  - GEM PATHS:
     - /Library/Ruby/Gems/2.0.0
     - /Users/k4zzk/.gem/ruby/2.0.0
     - /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/

このように表示されました。これから、「GEM PATHS:」と書かれているところを見ると、どうやら3つに分けて保存されているようです。

bundle install を実行すると、グローバルにインストールされるのですが、プロジェクト毎に管理したいときは

bundle install --path [dir path]

と入力します。 例えば、

bundle install --path vendor/bundle

というふうにします。 こうすると、rails app のルートディレクトリにある vendor/bundle ディレクトリに全てインストールされます。 また、このコマンドは一度実行すれば、bundlerはインストール先を記憶するので、次回以降は

bundle install

を実行すれば、vendor/bundle 配下にインストールされます。