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

时间:2018-07-02 15:07:15

标签: ruby-on-rails ruby rubygems bundler gem-bundler

运行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
  • Ruby-2.5.1
  • macOS High Sierra版本10.13.4

4 个答案:

答案 0 :(得分:1)

(代表问题作者发布)

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

答案 1 :(得分:1)

这是在我的系统上发生的,所以我花了一段时间。这似乎是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派生的任何对象(包括脚本/控制台顶层的“ main”对象)调用该方法。但是最后,它仍然是您从其调用任何对象的方法,因此require中任何没有显式接收器的方法调用都在同一对象上调用。

通常的继承规则适用,因此,如果您的对象没有显式的gem方法,将调用RubyGems在Kernel中定义的方法,这很好。但是,如果您的对象确实有自己的gem方法,那么它将被调用,这不太可能起作用。在这种情况下,将从require 'fileutils'https://github.com/rubygems/rubygems/blob/v2.6.9/lib/rubygems/installer.rb#L162)的初始化程序中调用Gem::InstallerGem::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”成为默认的宝石,这个奇怪的问题已经浮出水面。

答案 2 :(得分:0)

在Windows上,我已更新ruby并通过运行重新安装了ruby版本> 2的ruby devkit

choco install ruby2.devkit --force
choco upgrade ruby2.devkit`

然后我打开一个新的cmd,问题消失了。

答案 3 :(得分:0)

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

rvm 都做 gem install