ruby-on-rails - 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
- Ruby-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/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
(来源)
调用时出现错误gem(spec.name)
,但为什么呢?
它最终与 Ruby 的一个怪癖有关。尽管require
看起来有点像内置关键字,但它实际上是Kernel
模块中的一个方法。该模块包含在 中Object
,因此可以从任何继承的对象Object
(包括脚本/控制台顶层的“主”对象)调用该方法。但最终它仍然是您从中调用它的任何对象的方法,因此require
在同一个对象上调用没有显式接收器的任何方法调用。
正常的继承规则适用,因此如果您的对象没有显式gem
方法,则将调用 RubyGems 中定义的方法,Kernel
这很好。但是,如果您的对象确实有自己的gem
方法,则会改为调用该方法,这不太可能起作用。在这种情况下,从(https://github.com/rubygems/rubygems/blob/v2.6.9/lib/rubygems/installer.rb#L162)require 'fileutils'
的初始化程序中调用。该类有自己的零参数方法,由. 代码尝试使用一个参数调用它,结果出现了错误。Gem::Installer
Gem::Installer
gem
attr_reader :gem
require
(这个问题在 RubyGems 2.6.10 中通过将gem
调用更改Kernel.send(:gem, spec.name)
为https://github.com/rubygems/rubygems/pull/1822来解决。这是由 Bundler 库中的一些类似困难引起的,它也有一个对象定义自己的gem
方法。)
最后一个问题是为什么这发生在 Ruby 2.5 中而不是之前。事实证明,这个特定的调用gem
仅在尝试需要“默认”gem 时发生。在 Ruby 2.5 之前的版本中,“fileutils”不是默认的 gem,所以这些版本已经设法避免了这个特殊问题,即使是旧版本的 RubyGems。只有在 Ruby 2.5 使“fileutils”成为默认 gem 时,才会出现这个奇怪的问题。
推荐阅读
- python - Django 3.1.1 未找到静态文件
- javascript - 调整大小和移动多边形后如何获取多边形点的新位置
- prolog - 为什么这个序言的输出是yes/true?
- pine-script - 在交易视图版本 4 的价格图表上绘制/叠加基本数据“EPS”
- python - Azure 函数使用 ssh 访问私有 github 存储库
- reactjs - 当传递不同的 prop 值时,React 组件不会以动态方式工作
- javascript - Vue JS如何根据传递的嵌套v-for值设置选项?
- react-testing-library - 使用 screen.getBy* 与仅使用 getBy* 进行 react-testing-library 有什么区别?
- javascript - Excel VBA 登录网站并获取一些文件
- javascript - 如何在 A-Frame 中使用 Chart.js?