我正在运行 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)
这很奇怪,因为该行是定义代表各种需求操作的 lambda 哈希的块的一部分(即,版本 =,版本 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 会抛出这个错误?
谢谢。
编辑:厨师似乎在 1.8.7 上运行良好。会不会是 1.9.3 的问题?