rubygem更新(例如:thor)厨师失败

时间:2019-06-06 17:59:42

标签: rubygems chef

我的食谱中有两个节:

    Chef::Config[:rubygems_url]='http://localbox/gems' #ghetto-for-ghetto
    [
    # :
     %w(thor <0.20.3) ,
    # :
    ].each do |g,v|
      gem_package g do
        version     v if v
#        action      :remove
        action      :purge   # Mjolnir
      end
    end

    [
    # :
     %w(thor =0.20.3) ,
    # :
    ].each do |g,v|
      gem_package g do
        version     v if v
     end
    end

我的调用看起来不错,但随后失败了:

: 
   * gem_package[thor] action purge (up to date)
:
:
   * gem_package[thor] action install

     ================================================================================
     Error executing action `install` on resource 'gem_package[thor]'
     ================================================================================

     Mixlib::ShellOut::ShellCommandFailed
     ------------------------------------
     Expected process to exit with [0], but received '1'
     ---- Begin output of /usr/bin/gem install thor -q --no-rdoc --no-ri -v "=0.20.3" --clear-sources --source=https://www.rubygems.org --no-user-install --no-ri --no-rdoc ----
     STDOUT:
     STDERR: ERROR:  While executing gem ... (Errno::EEXIST)
         File exists - (/usr/local/bin/thor)
     ---- End output of /usr/bin/gem install thor -q --no-rdoc --no-ri -v "=0.20.3" --clear-sources --source=https://www.rubygems.org --no-user-install --no-ri --no-rdoc ----
     Ran /usr/bin/gem install thor -q --no-rdoc --no-ri -v "=0.20.3" --clear-sources --source=https://www.rubygems.org --no-user-install --no-ri --no-rdoc returned 1

     Resource Declaration:
     ---------------------
     # In /var/chef/cache/cookbooks/fake/recipes/default.rb

     121:   gem_package g do
     122:     version   v if v
     123:     options   '--no-user-install --no-ri --no-rdoc'
     124:     clear_sources     true
     125: #    gem_binary       '/usr/bin/gem'
     126:  end
     127: end

     Compiled Resource:
     ------------------
     # Declared in /var/chef/cache/cookbooks/fake/recipes/default.rb:121:in `block in from_file'

     gem_package("thor") do
       package_name "thor"
       action [:install]
       default_guard_interpreter :default
       declared_type :gem_package
       cookbook_name "fake"
       recipe_name "default"
       version "=0.20.3"
       options "--no-user-install --no-ri --no-rdoc"
       clear_sources true
       gem_binary "/usr/bin/gem"
     end
:

有趣的是,这是让厨师抬头的最初尝试:

# more /root/.gemrc
---
gem: --no-rdoc --no-ri
:verbose: false
:update_sources: true
install: --no-wrappers --no-user-install --conservative --minimal-deps
update: --no-wrappers --no-user-install --conservative --minimal-deps
:disable_default_gem_server: true
:sources:
- http://localbox/gems/

问题:

  1. 在自定义红宝石源粘贴之前,必须用多大的锤子锤击?需要明确的是,我们是一个中等安全的环境,很少/没有主机可以自己与外界联系。

  2. 什么时候净化的宝石仍然是宝石?我命令清洗时口吃了吗?

    # gem list --local thor

    *** LOCAL GEMS ***

    thor (0.19.1)
  1. 如果宝石可以与多个版本共存,那么为什么这个版本不能?

  2. 这种依赖地狱在红宝石中难道不罕见吗?

  3. 确实,我的目标是升级宝石,实际上是不可能的,因此我的计划B是在必要时用愤怒的神的力量击打旧版本。谁能看到我的计划破裂了?

1 个答案:

答案 0 :(得分:0)

感觉就像您缺少先决条件库(依赖项)。我建议您手动尝试安装rubygem,然后,一旦知道如何安装,就可以利用Chef。

捆绑红宝石的最佳方法可能是使用bundler来管理Gemfile。在您的情况下,Gemfile应该看起来像...

bundle_install '/path/to/Gemfile' do
  deployment true
  jobs 3
end

这应该可以管理所需的红宝石。

当然,您可以使用poise-ruby食谱再次利用Chef来为您运行捆绑器:

npm install --save grpc