Gem установить неправильное количество аргументов (дано 1, ожидается 0) - PullRequest
0 голосов
/ 02 июля 2018

Когда я запускаю 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
  • рубин 2.5.1
  • macOS High Sierra Версия 10.13.4

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Это происходило в моей системе, поэтому я немного покопался в ней. Кажется, это несовместимость между Ruby 2.5 и RubyGems <2.6.10. </p>

Краткий ответ

Если вы хотите установить Ruby 2.5, убедитесь, что у вас RubyGems> = 2.6.10. Вы можете явно указать, какую версию RubyGems использовать (например, я назвал rvm rubygems 2.7.7), или она может просто обновиться до более новой версии RVM / rbenv / и т. Д.

Более длинное объяснение

Как показано в обратном следе в вопросе, ошибка возникает при вызове require. Это версия require, которую RubyGems написал для замены определения, поставляемого с Ruby. В RubyGems до 2.6.10 эта часть кода выглядит примерно так:

spec = Gem.find_unresolved_default_spec(path)
if spec
  Gem.remove_unresolved_default_spec(spec)
  gem(spec.name)
end

( источник )

Ошибка возникает при вызове gem(spec.name), но почему?

В конечном итоге это связано с причудой Руби. Хотя require выглядит как встроенное ключевое слово, на самом деле это метод в модуле Kernel. Этот модуль включен в Object, поэтому метод может быть вызван из любого объекта, который происходит от Object (включая «основной» объект на верхнем уровне скрипта / консоли). Но, в конце концов, это все еще метод для любого объекта, из которого вы вызываете его, поэтому любые вызовы методов в require, которые не имеют явного получателя, вызываются для того же объекта.

Применяются обычные правила наследования, поэтому, если у вашего объекта нет явного gem метода, будет вызван метод, определенный в Kernel RubyGems, и это здорово. Но если у вашего объекта есть собственный метод 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 путем изменения вызова gem на Kernel.send(:gem, spec.name) в https://github.com/rubygems/rubygems/pull/1822. Это было вызвано несколько похожими трудностями в библиотеке Bundler, которая также имела объект, определяющий ее собственный gem метод.)

Последний вопрос: почему это произошло в Ruby 2.5, но не раньше? Оказывается, этот конкретный вызов gem происходит только при попытке потребовать гем «по умолчанию». В версиях Ruby до 2.5 "fileutils" не был гемом по умолчанию, поэтому этим версиям удалось избежать этой конкретной проблемы, даже с более старыми версиями RubyGems. Эта странная проблема возникла только в Ruby 2.5, который сделал «fileutils» драгоценным камнем по умолчанию.

0 голосов
/ 24 июля 2019

Находясь на Windows, я обновил ruby ​​и переустановил ruby ​​devkit для версии ruby> 2, запустив

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

Затем я открыл новый cmd, и проблема исчезла.

0 голосов
/ 03 июля 2018

(Опубликовано от имени автора вопроса) .

Я решил это, переустановив Rbenv, а затем используя rbenv rehash.

...