运行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>'
其他信息:
答案 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::Installer
。 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”成为默认的宝石,这个奇怪的问题已经浮出水面。
答案 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