こんにちは、黒田ひらくです。

TADA Tadashi さんは書きました:
> $SAFE=1でもrequireはできるので(↓)、原因はどこか他にあると思うの
> ですが、よくわかりません。
>
>    % ruby19 -e '$SAFE=1; require "net/http";'
>    # =>エラーなし


僕の環境で試したら、こんな風にnet/httpのrequireでもエラーになりました。

   $ ~/opt/ruby19/bin/ruby -ve '$SAFE=1;p require "net/http"'
   ruby 1.9.1p5000 (2009-01-28 trunk 21811) [x86_64-linux]
   -e:1:in `require': Insecure operation - require (SecurityError)
           from -e:1:in `<main>'

それで少し調べると、gemのディレクトリが優先されるようになっていて、

   $ ~/opt/ruby19/bin/ruby -e 'puts $:[0..5]'
   /home/hiraku/opt/gem/lib
   /home/hiraku/hg/misc/lib
   /home/hiraku/opt/gem/gems/rmagick-2.8.0/lib
   /home/hiraku/opt/gem/gems/rmagick-2.8.0/ext
   /home/hiraku/opt/gem/gems/rmagick-2.8.0/bin
   /home/hiraku/opt/gem/gems/hpricot-0.6.164/lib/universal-java1.6

試しに全てのgemを無効にしたら

   $ ~/opt/gem/gems$ mv * /home/hiraku/tmp/

het/httpをrequireしてもエラーにならなくなりました。

   $ ~/opt/ruby19/bin/ruby -ve '$SAFE=1;p require "net/http"'
   ruby 1.9.1p5000 (2009-01-28 trunk 21811) [x86_64-linux]
   true


しかし、ではどのgemが悪いのかと思ったら、どれをgemディレクトリに戻してもエラーが復活するので、
試しにgemを全部無効にしてから空のlibディレクトリだけを復帰させると

   $ ~/opt/gem/gems$ mv * /home/hiraku/tmp/
   $ ~/opt/gem/gems$ mkdir -p rake-0.8.3/lib

これだけでエラーが復活しました。


まとめると

 * 1.9になってgemが標準で使われるようになった(-rubygemsがいらなくなった)
 * なので、gemが何かインストールされていると'常に'それを見にいくようになった
 * SAFE=1だと、そのあたりが悪さをしてエラーになる

といった感じでしょうか。


# 1.8.7では、-rubygemsを付けていてもエラーにはなりませんでした。

1.8.7と1.9で$:のgem回りの用意の仕方に違いがあるみたいなので、その辺なのかも?
1.9だと先述の用に各gemのlibディレクトリが最初から$:に入ってますが、1.8.7は

   ~$ ruby -ve 'require "rubygems";puts $:'
   ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
   /home/hiraku/opt/gem/lib
   /home/hiraku/hg/misc/lib
   /usr/local/lib/site_ruby/1.8
   /usr/local/lib/site_ruby/1.8/x86_64-linux
   /usr/local/lib/site_ruby
   /usr/lib/ruby/vendor_ruby/1.8
   /usr/lib/ruby/vendor_ruby/1.8/x86_64-linux
   /usr/lib/ruby/vendor_ruby
   /usr/lib/ruby/1.8
   /usr/lib/ruby/1.8/x86_64-linux
   .

このように、各gemのlibは入っていません


ちなみに、僕の環境はこんな感じです。

 Ruby-1.8.7 : Ubuntu 8.10のパッケージ
 Ruby-1.9 : svnのソースからコンパイルして ~/opt/ruby19 にインストール
 gem : ~/opt/gem にインストール。GEM_HOME等もここを指す


以上、何かの参考になりましたら嬉しいです。

-- 
--------------------------------------------------
 黒田 拓(くろだ ひらく)
    hiraku / sapporo.email.ne.jp
    http://www.hinet.mydns.jp/
--------------------------------------------------