argius note

プログラミング関連

"ubygems"って? CygwinのRubyが動かない

少し前に、Railsで遊ぼうと思ったときに色々とインストールしたりしたのですが、忙しくなってしまい途中で放置していました。
久しぶりに使い捨てスクリプトをRubyで書いたので動かしてみたら、何か変なエラーがでました。

$ wruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
$ ruby -v
ruby 1.8.4 (2005-12-24) [i386-cygwin]
$ ruby test.rb
ruby: no such file to load -- ubygems (LoadError)    

Rubygemsのインストールに失敗したのかもと思ったのですが、よく見ると"ubygems"となっています。この時点では、設定関連の不整合があるのかもしれない*1と考えていましたが、私はRubyの実行時オプションをほとんど知らなかったので、具体的な原因はすぐには見当がつきませんでした。

調べてみた結果、直接の原因はWindowsの環境変数に"RUBYOPT=-rubygems"が設定されていたことでした。まとめると、

  • Win版Rubyインストーラ(One-Click Ruby Installer?)を入れたあとでCygwinRubyを使うと再現
  • Win版インストーラは、インストールの際に環境変数に"RUBYOPT=-rubygems"を設定するらしい
  • Rubyの実行時オプションには"-rLIBRARY"があり、"ruby -rrubygems"はコードの"require 'rubygems'"と同じ効果がある
  • Win版Rubyには恐らく"-rrubygems"と等価(?)の"-rubygems"オプションがあるが、Cygwin版には無いかバージョンが古い
  • CygwinではWindowsの環境変数をインポートするので"RUBYOPT"が参照されてしまう

ということのようです。CygwinRubyを使う時には、"RUBYOPT"から"-rubygems"を消してしまえば大丈夫です。

$ echo $RUBYOPT
-rubygems
$ export RUBYOPT=
$ echo $RUBYOPT

$ ruby test.rb
good day.
$ 

CygwinにもRubygemsが入っていれば問題ないのかも知れませんが、確認していません。そもそも、CygwinからでもWin版を実行できるので、Win版で事足りるなら上記の対応は不要です。

*1:実際の原因ではありませんでしたが、例えばWindowsで"\Rubygems"と書いてあるものをCygwinで評価した場合、先頭のRはエスケープシーケンス扱いされてしまう、ということです。