Gem 安装错误数量的参数(给定 1,预期 0)
Gem install wrong number of arguments (given 1, expected 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>'
补充信息:
- Rails 5.1.2
- Ruby-2.5.1
- macOS High Sierra 版本 10.13.4
(代题作者发表).
我通过重新安装 Rbenv 然后使用 rbenv rehash 解决了这个问题。
这发生在我的系统上,所以我研究了一段时间。 Ruby 2.5 和 RubyGems < 2.6.10 之间似乎不兼容。
简答
如果你想安装 Ruby 2.5,确保你有 RubyGems >= 2.6.10。您可以明确指定要使用的 RubyGems 版本(例如,我调用了 rvm rubygems 2.7.7
),或者更新到更新版本的 RVM/rbenv/etc.
更长的解释
如题中回溯所示,错误发生在调用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
(source)
调用gem(spec.name)
时出现错误,但为什么?
它最终与 Ruby 的怪癖有关。尽管 require
看起来有点像内置关键字,但它实际上是 Kernel
模块中的一个方法。该模块包含在 Object
中,因此可以从 Object
的任何对象调用该方法(包括 script/console 顶层的 "main" 对象)。但最终它仍然是您从中调用它的任何对象的方法,因此 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
class 有自己的 gem
零参数方法,由 attr_reader :gem
创建。 require
代码试图用一个参数调用它,但我们遇到了错误。
(此问题已在 RubyGems 2.6.10 中解决,方法是将 gem
调用更改为 https://github.com/rubygems/rubygems/pull/1822 中的 Kernel.send(:gem, spec.name)
。这是由一些类似的困难引起的Bundler 库,它也有一个定义自己的 gem
方法的对象。)
最后一个问题是为什么这发生在 Ruby 2.5 而不是之前。事实证明,这个对 gem
的特定调用仅在尝试要求 "default" gem 时发生。在 2.5 之前的 Ruby 版本中,"fileutils" 不是默认的 gem,因此这些版本设法避免了这个特殊问题,即使是旧版本的 RubyGems。只有 Ruby 2.5 使 "fileutils" 默认 gem 才会出现这个奇怪的问题。
这里可能安装了 ruby 的多个版本,因此您可以通过 rvm
安装 gem
rvm 都做 gem 安装
当我 运行 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>'
补充信息:
- Rails 5.1.2
- Ruby-2.5.1
- macOS High Sierra 版本 10.13.4
(代题作者发表).
我通过重新安装 Rbenv 然后使用 rbenv rehash 解决了这个问题。
这发生在我的系统上,所以我研究了一段时间。 Ruby 2.5 和 RubyGems < 2.6.10 之间似乎不兼容。
简答
如果你想安装 Ruby 2.5,确保你有 RubyGems >= 2.6.10。您可以明确指定要使用的 RubyGems 版本(例如,我调用了 rvm rubygems 2.7.7
),或者更新到更新版本的 RVM/rbenv/etc.
更长的解释
如题中回溯所示,错误发生在调用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
(source)
调用gem(spec.name)
时出现错误,但为什么?
它最终与 Ruby 的怪癖有关。尽管 require
看起来有点像内置关键字,但它实际上是 Kernel
模块中的一个方法。该模块包含在 Object
中,因此可以从 Object
的任何对象调用该方法(包括 script/console 顶层的 "main" 对象)。但最终它仍然是您从中调用它的任何对象的方法,因此 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
class 有自己的 gem
零参数方法,由 attr_reader :gem
创建。 require
代码试图用一个参数调用它,但我们遇到了错误。
(此问题已在 RubyGems 2.6.10 中解决,方法是将 gem
调用更改为 https://github.com/rubygems/rubygems/pull/1822 中的 Kernel.send(:gem, spec.name)
。这是由一些类似的困难引起的Bundler 库,它也有一个定义自己的 gem
方法的对象。)
最后一个问题是为什么这发生在 Ruby 2.5 而不是之前。事实证明,这个对 gem
的特定调用仅在尝试要求 "default" gem 时发生。在 2.5 之前的 Ruby 版本中,"fileutils" 不是默认的 gem,因此这些版本设法避免了这个特殊问题,即使是旧版本的 RubyGems。只有 Ruby 2.5 使 "fileutils" 默认 gem 才会出现这个奇怪的问题。
这里可能安装了 ruby 的多个版本,因此您可以通过 rvm
安装 gemrvm 都做 gem 安装