Develop with pleasure!

福岡でCloudとかBlockchainとか。

Bundler入れてみた。

Rubyのアプリケーションを開発する際に、gemでインストールされてるライブラリが複数バージョンインストールされた状態で特に意識することなく使っていたけど、運用環境にデプロイした際に、ライブラリのバージョン差異による不具合に遭遇したりする。

そんな状況にならないように、アプリケーションに適用するgemの依存性を管理してくれるライブラリがBundlerだ。てことで、早速使ってみた。

wycats/bundler · GitHub

まずは、インストール

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の機能を利用しているところが正常に動作しない。んー、何でだろ?依存性を定義し忘れてるのかなー。