gem_package не работает в Ruby 1.9.3 - неопределенный метод 'full_name' для nil

Я использую Chef для настройки узла под управлением Ubuntu 12.04. Я хотел использовать Ruby 1.9.3, в том числе для Chef, и использую этот пользовательский загрузчик файл, который я нашел для этого. (Ранее я пытался использовать RVM в сочетании с Chef и обнаружил, что это вызывает проблемы на каждом шагу — я надеялся, что это будет менее подвержено ошибкам.)

Когда я запускаю шеф-клиент на этом узле, он достигает точки попытки установить мое приложение Rails, пытается установить Bundler и терпит неудачу, таким образом:

Recipe: <Dynamically Defined Resource>
  * gem_package[Bundler] action install
================================================================================
Error executing action `install` on resource 'gem_package[Bundler]'
================================================================================


NoMethodError
-------------
undefined method `full_name' for nil:NilClass


Resource Declaration:
---------------------
# In /var/chef/cache/cookbooks/application_ruby/providers/rails.rb

162:     gem_package gem do
163:       action :install
164:       source src if src
165:       version ver if ver && ver.length > 0
166:     end
167:   end



Compiled Resource:
------------------
# Declared in /var/chef/cache/cookbooks/application_ruby/providers/rails.rb:162:in `block in install_gems'

gem_package("Bundler") do
  provider Chef::Provider::Package::Rubygems
  action [:install]
  retries 0
  retry_delay 2
  package_name "Bundler"
  version ">1.3"
  cookbook_name "tiptap_api"
end

Чтобы попытаться изолировать проблему, я поместил следующий вызов gem_package в рецепт перед попыткой развертывания:

gem_package 'Bundler' do
  version '>0'
  action :install
end

Это тоже не удается, таким же образом.

Я обнаружил, что исполняемый файл gem, установленный apt-get, на самом деле назывался gem1.9.1. Я подумал, что это может быть проблемой, и переименовал его в gem. Как только это было сделано, я мог запустить sudo gem install bundler нормально и без каких-либо проблем, но шеф-клиент все еще выдает эту ошибку.

Что происходит, как это исправить и почему это сообщение об ошибке такое ужасное?


person MrTheWalrus    schedule 04.09.2013    source источник
comment
"bundler" не то же самое, что "Bundler". Дело имеет значение!   -  person Holger Just    schedule 05.09.2013
comment
@HolgerJust С одной стороны, теперь я чувствую себя идиотом. С другой стороны, моя проблема решена, и если вы хотите сделать это ответом, я с радостью приму его.   -  person MrTheWalrus    schedule 05.09.2013
comment
Не чувствуй себя так. Иногда достаточно еще одной пары глаз, чтобы заметить очевидное :)   -  person Holger Just    schedule 05.09.2013


Ответы (1)


Судя по трассировке стека, вы хотите установить гем под названием Bundler. Однако этот драгоценный камень не существует, что приводит к ошибке, которую вы наблюдаете. Вместо этого вы, вероятно, захотите установить гем bundler. Дело вообще имеет значение в мире Ruby :)

Хотя верно то, что сообщение об ошибке вводит в заблуждение, причина этого, вероятно, в том, что случай с несуществующим драгоценным камнем явно не проверяется Chef, и поэтому предположения на более поздних этапах кода просто нарушаются, что приводит к странной ошибке.

Это, в свою очередь, может считаться ошибкой в ​​Chef, о которой вы можете сообщить на http://tickets.opscode.com/ (по крайней мере, если это все еще проблема в самой последней версии Chef, я этого не проверял).

person Holger Just    schedule 04.09.2013
comment
В общем, если в вашем репозитории гема нет гема, который вы пытаетесь установить, появится эта ошибка. Мы используем частный репозиторий, поэтому столкнулись с этим загадочным сообщением. - person DV.; 19.05.2014