Rails1.*で新旧のGemパッケージを両立させる方法
RubyGems(1.0)とCapistrano(2.0)のアップグレードにともなって、Rails1.*で開発したアプリケーションの起動やデプロイが失敗する場合があります。
素直にRailsをアップグレード出来たら良いのですが、プロジェクトの事情により古いバージョンのまま運用せざるを得ない状況もあるでしょう。
以下の説明は、新旧のGemパッケージを両立させるための対処方法です。
RubyGems
最新のChangeLogを読んでみると、
2007-12-19 Eric Hodel* lib/rubygems/installer.rb: Revert change that only wrapped executables with #!. * lib/rubygems/specification.rb: Warn about a lot of things that could be wrong with gemspecs on build, including missing #!. Use 'x86-mswin32' for legacy 'mswin32' platform, fix CURRENT platform. Paired with Luis Lavena. * lib/rubygems/remote_installer.rb: Deleted. * lib/rubygems.rb: Removed Kernel#require_gem. * doc/release_notes/rel_1_0_0.rdoc: RubyGems 1.0 release notes. * lib/rubygems/rubygems_version.rb: 1.0.0.
とあり、obsoluteだったメソッドrequire_gemが1.0から削除されたようです。
require_gemの代わりにgemが用意されているので、ソースコード中のrequire_gemをgemに置換すればいいのですが、アプリだけでなくパッケージのソースコードにも影響が広がりそうで、出来るならば既存のソースコードを更新したくはありません。
そこで、RAILS_ENV/config/environment.rbの先頭でエイリアスを定義してあげると上手くごまかすことができます。
そこで、RAILS_ENV/config/boot.rbのRubyGemsをrequireした後でエイリアスを定義してあげると上手くごまかすことができます。
# define alias :require_gem for applications which use older rubygems(< 1.0). require 'rubygems' alias :require_gem :gem if Gem::RubyGemsVersion.to_f >= 1.0
Capistrano
積極的な対応をとるならば、RAILS_ROOTの下で
% capify .
とし、RAILS_ROOT/config/deploy.rbを再編集すればいいでしょう。
一方、パッケージのバージョンを維持したまま消極的な対応をとるならば、強制的に1.4以下のパッケージを使用するよう指定する事になります。具体的には、RAILS_ROOT/lib/tasks/capistrano.rbで定義されているcapメソッドを以下のように変更します。
# Invoke the given actions via Capistrano def cap(*parameters) begin require 'rubygems' rescue LoadError # no rubygems to load, so we fail silently end # force to use older capistrano(<= 1.4) gem 'capistrano', '<=1.4.1' require 'capistrano/cli' Capistrano::CLI.new(parameters.map { |param| param.to_s }).execute! end