gpt4 book ai didi

ruby - Chef/Knife ( ruby )错误 : superclass mismatch for class Edit (TypeError)

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:05 29 4
gpt4 key购买 nike

我正在使用 bundler 来处理 ruby​​ gems 依赖项。我需要以编程方式使用 bundler 的 gem。

当我尝试以编程方式调用 knife 时,它的依赖项是在 Gemfile 中指定的,我遇到了错误。我执行 knife 如下:

Chef::Knife.run ["-v"] #invoking knife

并返回以下错误:

/var/lib/gems/2.0.0/gems/chef-11.6.2/lib/chef/knife/edit.rb:5:in `<class:Knife>': superclass mismatch for class Edit (TypeError)

我熟悉Ruby on Rails 3 : "superclass mismatch for class ..."以及发生这种情况的原因。但是我没有做任何与上述 stackoverflow 帖子中的解释一致的事情。

有人可以阐明这个问题并解决它吗?

最佳答案

你是对的,这是相关的错误。

class Edit 已在其他地方定义,其父类(super class)与现在尝试使用的父类(super class)不同。

在irb/pry上简单测试

[56] pry(main)> class Comida; end

[57] pry(main)> class Comida < Integer; end

TypeError: superclass mismatch for class Comida
from (pry):53:in `__pry__'

因此,您应该以编程方式发布/检查您对 bundler 的确切需求以及方式。为什么不使用 Gemfile 然后使用 bundle exec 来运行您的脚本?让 bundler 为您处理依赖关系,如果您以编程方式执行此操作,因为您担心需要 gem 的方式和时间,您可以添加 required: false 以避免自动行为并在需要时自行执行 require,即

更改此 Gemfile

gem 'chef-solo'
gem 'knife-solo'

对此:

gem 'chef-solo', require: false
gem 'knife-solo', require: false

然后在您的代码中手动执行需要时的要求,并收回您需要的控制权:

# ... code ....
require 'chef-solo'

# ... more code ...
require 'knife-solo'

至少有 3 种调试方法:

1) 普通的旧 ruby​​ 调试

收件人debug您可以在该违规行设置断点:

$ ruby -r debug your_program.rb

# Set a breakpoint where problem arises
break /var/lib/gems/2.0.0/gems/chef-11.6.2/lib/chef/knife/edit.rb:5

# Set a poor-man debug `puts` to find out where is a class defined
class Object
def self.inherited(klass)
targets = %w(Edit Chef::Knife::Edit)
puts "#{klass.name} defined at #{__FILE__}:#{__LINE__}" if targets.include?(klass.name)
end
end

# Now run until program ends or hits that breakpoint
cont

# Once it hits the breakpoing program will pause there and you can play around but the previus `puts` should already have showed where the `Edit` class is first defined.

#=> Chef::Knife::Edit defined at /some/pissing/file:432

2) 用 gem pry

您也可以使用 pry.binding 在该行停止程序并通过临时编辑 edit.rb 环顾四周看看发生了什么

$ vim /var/lib/gems/2.0.0/gems/chef-11.6.2/lib/chef/knife/edit.rb + 5

# Add this code before the offending line:
require 'pry'
binding.pry

还需要在您的 Gemfile 中包含 gem "pry" 才能正常工作并使用 bundle exec 运行程序忘记了。

程序将在继续之前停止(在 binding.pry 行),然后您可以使用 pry goodness 来找出已经定义该类的位置

[1] pry(main)> ? Bundler
#=> From: .../gems/bundler-1.3.5/lib/bundler.rb @ line 9

[2] pry(main)> ? Chef::Knife::Edit
#=> From: xxxxxxx.rb @ line xx

3) 使用 gem pry-rescue

还有pry-rescue gem 将“在出现问题时启动一个窥探 session ”

$ gem install pry-rescue pry-stack_explorer
$ rescue your_program.rb

或者,如果通过 bundle exec 运行您的程序,请将其添加到您的 Gemfile

group :development do
gem 'pry-rescue'
gem 'pry-stack_explorer'
end

每当出现异常时,程序都会进入一个 pry session!

很抱歉给了这么多选项,希望对您有所帮助!

关于ruby - Chef/Knife ( ruby )错误 : superclass mismatch for class Edit (TypeError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468110/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com