Ruby 1.9.3p392 を実行しており、最新の Chef gem (11.4.2) をインストールしました。シェフのコマンド ライン ユーティリティを実行しようとすると、次のエラーが表示されます。
bin/ruby_noexec_wrapper:14: stack level too deep (SystemStackError)
実際、以下を実行すると、同様のエラーがスローされます。
require 'rubygems'
gem 'chef' # or gem 'chef', '11.4.2'
もう少し深く掘り下げると、この問題は lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb から発生しているように見えます。
lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb:24: stack level too deep (SystemStackError)
その行は、さまざまな要件操作 (つまり、バージョン =、バージョン 1 >= バージョン 2 など) を表すラムダのハッシュを定義するブロックの一部であるため、これは奇妙です。
class Gem::Requirement
OPS = { #:nodoc:
"=" => lambda { |v, r| v == r },
"!=" => lambda { |v, r| v != r },
">" => lambda { |v, r| v > r },
"<" => lambda { |v, r| v < r },
">=" => lambda { |v, r| v >= r }, # <-- line 24
"<=" => lambda { |v, r| v <= r },
"~>" => lambda { |v, r| v >= r && v.release < r.bump }
}
#...
end
OPS[">="]
ファイルを下にスクロールすると、呼び出し可能な場所は 198 行目だけであることがわかります。
def satisfied_by? version
raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless
Gem::Version === version
# #28965: syck has a bug with unquoted '=' YAML.loading as YAML::DefaultKey
requirements.all? { |op, rv| (OPS[op] || OPS["="]).call version, rv } # <-- line 198
end
requirements.all?
の実行時に、要件が に設定されていることに気付きました[[">=", #<Gem::Version "0">]]
。評価しているよう<Gem::Version "11.4.2"> >= <Gem::Version "0">
です。
私は一日中これに取り組んできましたが、まだその根底にたどり着いていません。RubyGems がこのエラーをスローする理由を理解できる人はいますか?
ありがとう。
編集: Chef は 1.8.7 で正常に動作するようです。1.9.3の問題でしょうか?