Ruby 1.9.3中的gem_package失败 - 未定义的方法'full_name'为nil

时间:2013-09-04 15:34:03

标签: rubygems chef ruby-1.9.3

我正在使用Chef来设置运行Ubuntu 12.04的节点。我想使用Ruby 1.9.3,包括Chef,我正在使用我发现的this自定义引导文件来完成它。 (我之前尝试过将RVM与Chef结合使用,发现它在每一个转折点都会引起问题 - 我希望这样不会出错。)

当我在此节点上运行chef-client时,它会尝试安装我的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

这也以同样的方式失败了。

我发现apt-get安装的gem可执行文件实际上名为gem1.9.1。我认为这可能是问题所在,并将其重命名为gem。一旦完成,我可以正常运行sudo gem install bundler而没有任何问题,但是厨师 - 客户仍然会产生此错误。

发生了什么,我该如何修复它?为什么这条错误信息如此糟糕?

1 个答案:

答案 0 :(得分:1)

从堆栈跟踪中,您似乎想要安装名为Bundler的gem。但是,此gem不存在会导致您观察到的错误。您可能希望安装bundler gem。案例通常在Ruby世界中很重要:)

虽然错误消息确实具有误导性,但其原因可能是Chef未明确检查不存在的gem的情况,因此在代码的后续阶段中的假设只会中断导致奇怪的错误。

这反过来可能被认为是您可能想要在http://tickets.opscode.com/上报告的Chef中的错误(至少如果在最新版本的Chef中仍然存在问题,我还没有检查过)。