2

我正在运行 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 的问题?

4

0 回答 0