ruby 1.9.2p290 (2011-07-09) [i386-mingw32]
ruby 1.9.2で久しぶりにrabbitをインストールしようとしてみました。失敗です。
c:\ruby\bin>gem install rabbit ERROR: While executing gem ... (ArgumentError) undefined class/module YAML::PrivateType
rabbitが依存しているrdtoolで試してみました。これも失敗。
c:\ruby\bin>gem install rdtool ERROR: While executing gem ... (ArgumentError) undefined class/module YAML::PrivateType
ちなみに同様なことで困っている人がいました。
トレースを見るにc:\ruby\lib\ruby\site_ruby\1.9.1\rubygems\specification.rb
のMarshal.loadでYAMLのオブジェクトをロードしようとしてコケていました。
なんでそんなことになるのかgem fetchで入手したgemを解凍して調べてみました。
metadataを眺めていたらとても怪しい文字列が。
rubyforge_project: !!null
試しにirbで似たのを評価してみると、
irb(main):001:0> require 'yaml' => true irb(main):002:0> YAML.load("aaa: null") => {"aaa"=>nil} irb(main):003:0> YAML.load("aaa: !null") => {"aaa"=>nil} irb(main):004:0> YAML.load("aaa: !!null") => {"aaa"=>#<Syck::PrivateType:0xdcdb38 @type_id="null", @value="">}
こんな感じになりました。なんでmetadataがこんなことになっているのかはわかりませんが。
というわけで、急場しのぎにはyamlをrequireしてあげればとりあえず問題を回避できることがわかりました。
さて、ここまでの話なんですが、Rabbitのリリースアナウンスに
http://www.cozmixng.org/~w3ml/index.rb/rabbit-shockers/msg/895
もしかしたら、 % ruby -r yaml -S gem install rabbit としないとダメかもしれません。
としっかり書かれていました。既知でした。