Rubyのアプリケーションを開発する際に、gemでインストールされてるライブラリが複数バージョンインストールされた状態で特に意識することなく使っていたけど、運用環境にデプロイした際に、ライブラリのバージョン差異による不具合に遭遇したりする。
そんな状況にならないように、アプリケーションに適用するgemの依存性を管理してくれるライブラリがBundlerだ。てことで、早速使ってみた。
まずは、インストール
gem install bundler
Bundlerを利用するにはアプリケーションのルートディレクトリに「Gemfile」という名前のマニフェストファイルを用意する必要がある。このファイルにアプリケーションの依存性について定義する。
説明用に掲載されてるGemfileがこちら↓テキトーに意訳。
# 少なくとも最低1つは依存性を定義する必要がある。 gem "rails" # バージョンを指定する場合は、ライブラリの後にバージョンを定義。 gem "rack", "1.0.0" # rspecの依存性を定義。:onlyで:testingを定義することで以下のようにテスト時のみ有効になる。 # :onlyの他、:exceptで指定された環境以外の際に有効にすることも可能。 gem "rspec", :only => :testing # :vendored_atを指定すると指定されたパスを参照するようになるみたい。 # ただ、このオプション自体非推奨で:pathオプションで代替した方が良いみたい。 gem "rspec", "1.1.6", :vendored_at => "vendor/rspec" # :vendored_atと同様の動作をするが、初回ダウンロードをgitリポジトリから行う。 gem "rails", "3.0.pre", :git => "git://github.com/rails/rails.git" # gem取得先のリストを追加する。 # Rubyforge(http://gems.rubyforge.org)はデフォで取得先としリストに追加されている模様。 source "http://gems.github.com" # 取得したgemの保存先を指定する。オプションの設定項目で、デフォルト値は、「 vendor/gems」 bundle_path "my/bundled/gems" # gem executables?のコピー場所を指定。 # オプションの設定項目で、デフォルト値は「bin」 bin_path "my/executables" # rubygemsを完全に無効にするためのオプション。 disable_rubygems
Gemfileに必要なgemの依存性を定義したら、いざ実行。
gem bundle
vendor/gems以下にがっつりgemがインストールされる。
Railsで利用する場合は、vendor/gems以下に配備されたgemを参照する必要があるので、configディレクトリ直下のpreinitializer.rbの先頭に以下のように記載する必要がある。
(preinitializer.rbは、boot.rbでRails起動時に呼ばれるイニシャライザ。ファイルが存在しない場合は作成する。)
require "#{RAILS_ROOT}/vendor/gems/environment"
vendor/gems/environment.rbでBundlerで管理するgemファイルをロード対象にしてる模様。あとは通常通りRailsアプリを起動すれば良い。
既存アプリに適用してみると、アプリでI18nの機能を利用しているところが正常に動作しない。んー、何でだろ?依存性を定義し忘れてるのかなー。