massの日記

日々の薪

Rails2.3.8へのBundler導入

Rails2.3.8のPjにBundlerを導入してみた。

まずは既存の環境にbundlerをインストール。

$ sudo gem instal bundler

Railsプロジェクトに移動

$ cd #{RAILS_ROOT}

Gemfileの作成(内容省略、確実なのはgem listで表示されたものを入れること。今使っているものをそのまま使えば、少なくともgemのversionによる依存関係の問題は発生しない)

$ emacs Gemfile

ここからはBundlerのOfficialサイトにあった、Rails2.3系のプロジェクトのBundlerの導入方法に従った。
http://gembundler.com/rails23.html
gemのパスをbundlerものに認識するようboot.rbに下記のコードを追記。

class Rails::Boot
  def run
    load_initializer

    Rails::Initializer.class_eval do
      def load_gems
        @bundler_loaded ||= Bundler.require :default, Rails.env
      end
    end

    Rails::Initializer.run(:set_load_path)
  end
end

bundlerがインストールされているか、Versionが古すぎないかをチェックするため、config/preinitializer.rbを追加

begin
  require "rubygems"
  require "bundler"
rescue LoadError
  raise "Could not load the bundler gem. Install it with `gem install bundler`."
end

if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.24")
  raise RuntimeError, "Your bundler version is too old for Rails 2.3." +
   "Run `gem install bundler` to upgrade."
end

begin
  # Set up load paths for all bundled gems
  ENV["BUNDLE_GEMFILE"] = File.expand_path("../../Gemfile", __FILE__)
  Bundler.setup
rescue Bundler::GemNotFound
  raise RuntimeError, "Bundler couldn't find some gems." +
    "Did you run `bundle install`?"
end

サーバ側とRails側の準備ができたので、gemをインストール、

$ bundle install --path ./vendor/bundle
# サーバ起動
$ bundle exec rails script/server -d

とここまでは順調に進めていたのだけどいのだけど、Production環境でエラーが発生。原因はmysqlのgem。
どうもmysqlはbundlerを想定していない作りらしく、そのままbuildするとmysqlのクライアントライブラリとかをソース内に記載されている相対パスで見てしまうらしい。
なので、gemをインストールする前にbuildパスを設定する必要がある。また、もう一つの注意点として環境によっては対象マシンが64bitだと明記する必要がある模様。

$ bundle config build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config
$ # envでARCHFLAGSが設定されているか確認。設定されていたら下記の上一行は不要。
$ export ARCHFLAGS="-arch x86_64"
$ bundle install --path ./vendor/bundle