为什么每当我使用 gem 命令时 Ruby 都会抛出语法错误?

Why is Ruby throwing a syntax error whenever I use the gem command?

这是我第一次尝试使用 Ruby。我想安装 sass 所以我更新了 gem 并尝试安装 sass 但被抛出错误。然后我意识到每当我 运行 gem 时都会出现语法错误 - 我无法弄清楚是什么导致了这种情况以及所有其他类似情况发生在他们的代码中,而不是当他们只是 运行命令。

到目前为止,我还没有接触过源代码,甚至没有使用过 gem 命令。该错误是一个语法错误,具体来说:

$ gem
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': /Library/Ruby/Gems/2.0.0/gems/psych-3.0.0/lib/psych/scalar_scanner.rb:146: syntax error, unexpected tIDENTIFIER, expecting ')' (SyntaxError)
      klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset)
                                                    ^
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Library/Ruby/Gems/2.0.0/gems/psych-3.0.0/lib/psych/nodes/node.rb:4:in `<top (required)>'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Library/Ruby/Gems/2.0.0/gems/psych-3.0.0/lib/psych/nodes.rb:2:in `<top (required)>'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /Library/Ruby/Gems/2.0.0/gems/psych-3.0.0/lib/psych.rb:14:in `<top (required)>'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems.rb:585:in `load_yaml'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/config_file.rb:314:in `load_file'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/config_file.rb:191:in `initialize'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/gem_runner.rb:66:in `new'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/gem_runner.rb:66:in `do_configuration'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/gem_runner.rb:46:in `run'
    from /usr/bin/gem:21:in `<main>'

这是一个 known bug in the gemspec of Psych 3.0.0, which lists the required Ruby version as >= 1.9.2,尽管 Psych 3.0.0 实际上需要 Ruby 2.2.2(在 Ruby 2.1 中引入了在您的案例中导致错误的特定语法):

s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")

problem has been fixed in the repository,但还没有包含该修复程序的版本。

错误报告中提到了解决问题的必要步骤,基本上你需要手动删除 b0rked Psych 3.0.0 gem 目录,然后你可以卸载 Psych 3.0.0,然后,你需要确保不再安装3.0.0:

FYI, for anyone landing on the issue as described in the first post, where even the gem command won't even work:

  • You must rm -rf psych 3.0.0's gem directory. (after that, the gem command should work)
  • Then you can do gem uninstall psych -v 3.0.0.
  • Then, until version 3.0.0 gets fixed, you must add gem 'psych', '< 3.0.0' to your Gemfile.
  • You might have to run bundle update for it to accept your change of psych's version.