Gem 安装错误的参数数(给定 1,预期为 0)



当我运行bundle时,我得到以下结果:

The `bundle' command exists in these Ruby versions: 2.1.8 2.4.2 jruby-9.1.15.0

我的项目使用 Ruby-2.5.1,所以我尝试使用gem install bundler更新我的捆绑器,但我收到以下错误:

ERROR: While executing gem ... (ArgumentError) wrong number of arguments (given 1, expected 0)

使用--backtrace

/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:47:in `require'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/installer.rb:162:in `initialize'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/installer.rb:104:in `new'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/installer.rb:104:in `at'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/resolver/specification.rb:93:in `install'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/request_set.rb:166:in `block in install'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/request_set.rb:156:in `each'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/request_set.rb:156:in `install'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/commands/install_command.rb:251:in `install_gem'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/commands/install_command.rb:301:in `block in install_gems'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/commands/install_command.rb:297:in `each'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/commands/install_command.rb:297:in `install_gems'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/commands/install_command.rb:204:in `execute'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/command.rb:310:in `invoke_with_build_args'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/command_manager.rb:169:in `process_args'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/command_manager.rb:139:in `run'
/Users/spencerbailey/.rbenv/versions/2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/gem_runner.rb:55:in `run'
/Users/spencerbailey/.rbenv/versions/2.5.1/bin/gem:21:in `<main>'

额外信息:

  • 导轨 5.1.2
  • 红宝石-2.5.1
  • macOS High Sierra 版本 10.13.4

这发生在我的系统上,所以我深入研究了一段时间。Ruby 2.5 和 RubyGems <2.6.10 之间似乎不兼容。

简答题

如果你想安装 Ruby 2.5,请确保你有 RubyGems>= 2.6.10。您可以明确指定要使用的 RubyGems 版本(例如,我调用了rvm rubygems 2.7.7(,或者只需更新到较新版本的 RVM/rbenv/等即可。

更长的解释

如问题中的回溯所示,调用require时发生错误。这是 RubyGems 编写的require版本,用于替换 Ruby 附带的定义。在 2.6.10 之前的 RubyGems 中,这部分代码如下所示:

spec = Gem.find_unresolved_default_spec(path)
if spec
Gem.remove_unresolved_default_spec(spec)
gem(spec.name)
end

(来源(

调用gem(spec.name)时会发生错误,但为什么呢?

它最终与Ruby的一个怪癖有关。尽管require看起来有点像内置关键字,但它实际上是Kernel模块中的一个方法。该模块包含在Object中,因此可以从任何从Object衍生的对象(包括脚本/控制台顶层的"主"对象(调用该方法。但最终它仍然是您从中调用它的任何对象上的方法,因此require内没有显式接收器的任何方法调用都会在同一对象上调用。

正常的继承规则适用,因此如果您的对象没有显式gem方法,则将调用 RubyGems 在Kernel中定义的方法,这很棒。但是,如果您的对象确实有自己的gem方法,则会改为调用该方法,这不太可能起作用。在这种情况下,require 'fileutils'Gem::Installer(https://github.com/rubygems/rubygems/blob/v2.6.9/lib/rubygems/installer.rb#L162( 的初始值设定项中调用。Gem::Installer类有自己的参数为零的gem方法,由attr_reader :gem创建。require代码尝试使用一个参数调用它,我们遇到了错误。

(此问题已在 RubyGems 2.6.10 中通过在 https://github.com/rubygems/rubygems/pull/1822 中将gem调用更改为Kernel.send(:gem, spec.name)得到解决。这是由 Bundler 库中的类似困难引起的,该库也有一个对象定义自己的gem方法。

最后一个问题是为什么这发生在 Ruby 2.5 中,而不是之前。事实证明,这种对gem的特定调用仅在尝试需要"默认"gem 时发生。在 2.5 之前的 Ruby 版本中,"fileutils" 不是默认的 gem,因此这些版本设法避免了这个特定问题,即使使用旧版本的 RubyGems。只有当 Ruby 2.5 将"fileutils"作为默认 gem 时,这个奇怪的问题才出现了。

(代表问题作者发布(。

我通过重新安装 Rbenv 然后使用 rbenv rehash 解决了它。

这里可能已经安装了多个版本的 ruby,因此您可以通过 rvm 进行 gem 安装

RVM 都做 gem install

最新更新