RubyGems 1.5 が出たけど

2011/02/04

先日(2011/1/31)に、RubyGems 1.5がリリースされました。

RubyGems 1.4.x で生じていた「Ruby 1.9 で動かない」という困った問題が解消され大変よろこばしいことなのですが、早速、同僚から別の問題が報告されました。

Rails 2.3.4 で動かないよ。

というのです。

あるブログ記事に寄せられたコメントによると「Rails 2.3.5 でも動かない」そうです。同僚の報告によれば、最新の2.3.10では大丈夫らしい。

可能であればこの機会に該当するRailsアプリケーションを最新の2.3.10にアップグレードすべきところですが、現実にはなかなかそういうわけにも行きません。

というわけで、RubyGems 1.3.7にダウングレードする手順をメモしておきます。

まず、インストールされている rubygems-update のバージョンを調べます。

$ gem list rubygems-update

*** LOCAL GEMS ***

rubygems-update (1.4.0)

1.3.7より新しいのがあれば、削除します(Windowsではsudo不要)。

$ sudo gem uninstall -v 1.4.0 rubygems-update

1.3.7をインストールします(Windowsではsudo不要)。

$ sudo gem install -v 1.3.7 rubygems-update
$ sudo update_rubygems

古いバージョンのRailsアプリケーションをメンテナンスしなければならない方は気をつけてください。

複数のバージョンのRubyGemsを使い分けたい方は、rvm を用いてRuby実行環境を切り替えられるようにするとよいでしょう。詳しくは、技術評論社のサイトにある解説記事(第39回 RVM(Ruby Version Manager)による環境構築)を参照してください。

参考資料


[追記] 今日、バグフィックスのためにある Rails アプリを久しぶりに起動した時に、これの Rails は 2.3.5 のままであることにふと気付きました。

もう私は RubyGems を 1.5.0 に上げていたので「何で動くのだろう」と思って config/environment.rb を開くと、次のような記述がありました。

# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION
  
# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')

# Quick patch to suppress the warning message from RubyGems 1.3.6
if Gem::VERSION >= "1.3.6"
  module Rails
    class GemDependency
      def requirement
        r = super
        (r == Gem::Requirement.default) ? nil : r
      end
    end
  end
end

すっかり忘れていたのですが、RubyGems のバージョンを 1.3.6 に上げたときに、ログに出る警告メッセージを止めるために追加したのでした。

今あなたが遭遇しているエラーメッセージが

undefined local variable or method `version_requirements' for #<Rails::GemDependency:0x7f3fa13f6ca8> (NameError)

こんな感じのものであれば、上のコードの if から end までをコピーして config/environment.rb の所定の位置(bootをrequireした直後)に貼り付ければ、解決するはずです。

で、ここまで書いた後、念のため「Rubygems 1.5」で検索してみると、gem 1.5.0とbundler 1.0.9ではエラーになるので注意: bundlerを1.0.10にアップデート必要という記事を発見。

再現のため bundler を 1.0.9 にダウングレードしてみると、確かに次のようなエラーが出ます。

uninitialized constant Gem::SilentUI (NameError)

もちろん bundler を 1.0.10 にすれば大丈夫。(2010/2/5)