Hatena::ブログ(Diary)

ursmの日記

2010-02-14

Rails 2.3.5 で Bundler 0.9.5 を使う

http://github.com/carlhuda/bundler

動作させるまで

config/environment.rbconfig.gem を使っている場合は削除しておく。

#{RAILS_ROOT}/Gemfile を作る。注意: rails は :require => nil にすること。

source :gemcutter

gem 'rails', '2.3.5', :require => nil
gem 'haml'

group :test do
  gem 'rspec-rails'
  gem 'rr'
end

インストール。

$ bundle install

gem のバージョンを固定する。Gemfile.lock.bundle/environment.rb が作られる。

$ bundle lock

config/preinitializer.rb を作成する。

begin
  require File.expand_path('../../.bundle/environment', __FILE__)
rescue LoadError
  raise RuntimeError, "You have not locked your bundle. Run `bundle lock`."
end

config/boot.rb の後ろの方、Rails.boot! の前に以下のコードを挿入する。

class Rails::Boot
  def run
    load_initializer
    extend_environment
    Rails::Initializer.run(:set_load_path)
  end
 
  def extend_environment
    Rails::Initializer.class_eval do
      old_load = instance_method(:load_environment)
      define_method(:load_environment) do
        Bundler.require :default, Rails.env.to_sym
        old_load.bind(self).call
      end
    end
  end
end

# All that for this:
Rails.boot!

これで (相性の悪い gem がなければ) 動くはず。

デプロイ (Capistrano)

GemfileGemfile.lockリポジトリにコミットする。.bundle/* は ignore する。

config/deploy.rb

以下のコードを追加。

after 'deploy:finalize_update' do
  run "cd #{latest_release} && bundle install #{shared_path}/vendor --without development,test && bundle lock"
end

bundle install の引数でインストール先ディレクトリを指定できる。省略すると ~/.bundle。アプリケーションごとに分かれている方が精神衛生上いいので、shared_path 以下を指定している。

Gemfile.lock に書かれている gem がすでにあれば、ダウンロードやビルドが省略されてとても高速に動作する。Gemfile.lock がないと gem の更新チェックを行うので遅い。

gem の追加/バージョンアップはローカルで bundle install --relock したあと、GemfileGemfile.lock をコミットしてデプロイする。この場合、relock 後の初回デプロイだけ少し時間がかかる。

ごとーごとー 2010/02/25 14:52 情報公開ありがとうございます。
これにしたがってセットアップしてみたのですが、
no such file to load -- rubygems/dependency_list (MissingSourceFile)
とエラーがでます。
gems/rails-2.3.5/lib/rails/plugin/locator.rb:89
が上記ファイルを要求しているようで、元々のrequireパスがすべて削除
されているのが原因のようですが、回避策をご存知でしたら教えてもらえ
ないでしょうか。

ursmursm 2010/02/26 01:32 むむ、聞いたことのないエラーです。
新しく作った Rails アプリでもなりますか?

ごとーごとー 2010/03/01 18:24 新しく作った空っぽのRailsアプリになります。
自己解決しました。

ちょっと、特殊でGEM_HOMEを指定して、rubyインストールディレクトリではないところに
rubygemsを入れているため、rubygemsのディレクトリを見つけられなくなっていました。

preinitializer.rbを以下に変更することで、対応しました。

begin
require File.expand_path('../../.bundle/environment', __FILE__)
$LOAD_PATH << File.expand_path(File.join(ENV['GEM_HOME'], 'lib')) if ENV['GEM_HOME']
rescue LoadError
raise RuntimeError, "You have not locked your bundle. Run `bundle lock`."
end

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証