【问题标题】:Gem install wrong number of arguments (given 1, expected 0)Gem 安装错误数量的参数(给定 1,预期为 0)
【发布时间】:2018-12-10 20:31:29
【问题描述】:

当我运行 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

【问题讨论】:

  • 完整的错误是什么?
  • 这是完整的错误。
  • 您是否在 Gemfile 中指定了 ruby​​ 版本?你试过运行rbenv rehash吗?您是否使用 rbenv global 2.5.1 设置了全局 ruby​​ 版本?
  • 是的。 rbenv globalrbenv local 已经设置为 2.5.1 和 rbenv rehash 似乎没有做任何事情。
  • 您将此标记为“已解决”。您为什么不发布作为您自己问题的答案?它是允许的......否则,即使您在问题中编写了解决方案,它也会作为一个未解决的问题。

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


【解决方案1】:

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

rvm 都做 gem install

【讨论】:

    【解决方案2】:

    这发生在我的系统上,所以我研究了一段时间。这似乎是 Ruby 2.5 和 RubyGems

    简答

    如果您想安装 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 的任何派生对象(包括脚本/控制台顶层的“主”对象)调用该方法。但最终它仍然是您调用它的任何对象的方法,因此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 中的 Kernel.send(:gem, spec.name) 调用更改为 Kernel.send(:gem, spec.name) 解决了这个问题。这是由 Bundler 库中的一些类似困难引起的,该库也有一个定义自己的对象 @ 987654345@方法。)

    最后一个问题是为什么这发生在 Ruby 2.5 而不是之前。事实证明,这种对gem 的特殊调用仅在尝试要求“默认”gem 时发生。在 Ruby 2.5 之前的版本中,“fileutils”不是默认的 gem,所以这些版本已经设法避免了这个特殊问题,即使是旧版本的 RubyGems。只有在 Ruby 2.5 使“fileutils”成为默认 gem 时才会出现这个奇怪的问题。

    【讨论】:

      【解决方案3】:

      (代表问题作者发布).

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

      【讨论】:

        猜你喜欢
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多