gemのアップデートには気をつけて
投稿者 おおかゆか
gemのバージョンが古い状態で新しめのRailsを走らせようとすると、
$ ./script/server
Rails requires RubyGems >= 1.1.1 (you have 0.9.4). Please `gem update --system` and try again.
というように、gemのアップデートをしろと怒られる。しかし、ここには壮大なトラップが隠されている。
ホイホイとそれに従ってしまうとどうなるか。
$ sudo gem update --system
Updating RubyGems...
Attempting remote update of rubygems-update
Successfully installed rubygems-update-1.3.1
Updating version of RubyGems to 1.3.1
Installing RubyGems 1.3.1...のように、インストールは一見成功したように見える。しかしここからが地獄の始まりだ。
$ gem -v
/usr/bin/gem:10:Warning: Gem::manage_gems is deprecated and will be removed on or after March 2009.
/usr/bin/gem:23: uninitialized constant Gem::GemRunner (NameError)がーん。gemが壊れてしまった…。
gem自身はaptでインストールされているのだから、apt-get remove して apt-get install のようにインストールし直せばいいんじゃないかと思うかもしれないが、それは甘い。そんなことをしても事態は一向に解決しない。やってみた私が言うのだから間違いない。
実はこのアップデートのやり方は間違っているのだ。正しくは、
$ sudo gem install rubygems-update
$ sudo update_rubygemsこのようにしないといけない。じゃ最初からそう書けよと突っ込みたくなるが、1.3のgemなら冒頭の方法でもいいらしく、このやり方は1.3以前のバージョンから1.3以降のバージョンにアップデートするときだけの限定仕様なのだそう。
だからRailsを責めるのは筋違いなのかもしれない。とは言っても、この事態をどうしてくれるのか。gemが壊れた状態では、Railsを含むRuby関連のパッケージのインストールもアップデートも全くできない。
最悪、OSの再インストールまで考えたが、何か方法はあるはずと色々調べてみた。そうしたら何のことはない、馬鹿馬鹿しいほど簡単な方法で解決してしまった。
$ cd /usr/bin/
$ sudo rm gem
$ sudo ln -s gem1.8 gem
そう、新しいgemはgem1.8という名前でインストールされていただけだったのだ。
そして解決のヒントは、実はすでに手の中にあった。ただそれに気づかなかっただけで。「gem update –system」を実行したとき、大量のメッセージが流れたのだが、その最後の部分にこう書かれていた。
RubyGems installed the following executables:
/usr/bin/gem1.8
If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.…いや、だって英語のメッセージが何百行も表示されたら、ふつう誰だって読もうとしないじゃん? まさかこんなことになるなんて思わないしさ。
というわけで、gemのバージョンアップにはこんな罠が隠されていうお話。くれぐれもご注意を。
追記:
「gem list」って実行したら、パッケージのリストが空になってた…。実体のファイルは依然として /var/lib/gems/1.8/gems/ に存在するので、ローカルのリスト管理のあたりがちゃんと更新できなかったのだろう。
やっぱり正しいインストール法をしなかったからリストの継承がうまくいかなかったのだろうかと思って別のマシンで「update_rubygems」をやってみたら、同じくリストが空に。なんじゃそら。
仕方なく必要なパッケージを全部「gem install」でインストールし直した。もっとスマートな解決策があるのかもしれないが、調べる気力も残ってなかったので。
さらに追記:
Ubuntu8.10以降の場合の正しいアップデートの方法は、
$ sudo apt-get install rubygems1.8
だろう。「apt-cache search rubygems」を実行したら、rubygemの他にrubygems1.8、rubygems1.9というパッケージが見つかった。
つまりRuby1.9の安定版がリリースされたことでUbuntu8.10以降の無印rubygemパッケージはバージョン更新が止まり、今後はrubygems1.8とrubygems1.9の2系統に分かれてメンテナンスされていくのだと思われる。
本文で紹介した方法は、8.04以前のバージョンにおいて有効。rubygems1.8パッケージが存在せず、無印のバージョン更新もなされていないため、gem自身でアップデートさせるしか方法がない。
またまた追記:
「追記」で書いたような現象が起きる理由が判明。
バージョンアップに伴い、gemのベースディレクトリが「/var/lib/gems/1.8/」から「/usr/lib/ruby/gems/1.8/」に変更されていることが原因のよう。
さらに、今まで実行ファイルは「/var/lib/gems/1.8/bin/」に置かれていたが、今度からは「/usr/bin/」にそのまま置かれるようになっている。なんかもろもろ大激変ですな。


















