Ruby 扩展模块的未定义局部变量或方法

Ruby 扩展模块的未定义局部变量或方法,ruby,chef-infra,knife,Ruby,Chef Infra,Knife,注意:问题经过编辑以反映问题 我想和鲁比基姆一起工作。附上我的一段代码 require 'chef' require 'chef/knife' require 'knife/api' module X module Y module Z include Chef::Knife::API def self.foo resp = knife_capture :search, ['*:*'] puts resp end

注意:问题经过编辑以反映问题

我想和鲁比基姆一起工作。附上我的一段代码

require 'chef'
require 'chef/knife'
require 'knife/api'

module X
  module Y
    module Z
      include Chef::Knife::API

      def self.foo
        resp = knife_capture :search, ['*:*']
        puts resp
      end
    end
  end
end
当调用
X::Y::Z.foo
时,它返回

gems/knife-api-0.1.7/lib/knife/api.rb:41:in `ensure in knife_capture': undefined local variable or method `revert_io_channels' for X::Y::Z (NameError)
似乎在
X::Y::Z.foo
中无法访问包含作用域函数(
Chef::Knife
中的
Knife api



我该怎么做呢?

这个gem是另一个不再维护的项目的分支。看看gem代码,最新版本(
0.1.7
)似乎存在一些问题,原因是对原始代码进行了一些糟糕的重构。该版本是一年前发布的,从那以后就再也没有提交过。回购协议也不接受发行票据,也没有测试。如果您必须使用这个gem,我将尝试一个悲观的约束
gem'knife-api',“<0.1.7”
,看看它是否有效。然而,完全跳过它可能是一个更好的主意。我试图解决问题并提交PR。您也可以尝试从我的分支回购中提取gem

此gem是另一个不再维护的项目的分支。看看gem代码,最新版本(
0.1.7
)似乎存在一些问题,原因是对原始代码进行了一些糟糕的重构。该版本是一年前发布的,从那以后就再也没有提交过。回购协议也不接受发行票据,也没有测试。如果您必须使用这个gem,我将尝试一个悲观的约束
gem'knife-api',“<0.1.7”
,看看它是否有效。然而,完全跳过它可能是一个更好的主意。我试图解决问题并提交PR。您也可以尝试从我的分叉回购中提取gem,完全不回答,不要使用
刀api
gem。它不应该存在。如果你想从Ruby代码中访问Chef API数据,正确的gem是
Chef API
(我知道,我们对名字很有创意)。如果您想做一些非常小的事情,请查看仅公开原始Chef对象API的
knife exec
命令(不像
Chef API
那样精细,而是内置的)。

在完全没有答案的情况下,不要使用
knife API
gem。它不应该存在。如果你想从Ruby代码中访问Chef API数据,正确的gem是
Chef API
(我知道,我们对名字很有创意)。如果您想做一些非常小的事情,请查看仅公开原始Chef对象API的
knife exec
命令(不像
Chef API
那样精细,而是内置的)。

假设
knife
来自
Chef::knife::API
,您可以尝试
extend
而不是
include
,以使其可用于类方法(例如
self.foo
)@maxpleaner:您能回答这个问题以接受它吗?@maxpleaner:您的建议仅适用于
函数,尽管在使用
刀(u capture
函数时,它反过来使用封闭范围中的其他函数,例如
revert\u io\u channels
function,返回以下错误
NameError:X::Y:Module`的未定义局部变量或方法
revert\u io\u channels'。我怎样才能包括所有内容,包括封闭范围(或享受它的封闭)?不要使用该gem,使用
chef-api
@coderanger:一如既往,谢谢。你能添加一个答案让我接受吗?假设
knife
来自
Chef::knife::API
,你可以尝试
extend
,而不是
include
,以使它可以用于类方法(例如
self.foo
)@maxpleaner:你能回答一下吗?maxpleaner:你的建议只适用于
功能,但在使用
刀捕捉
功能时,它又会使用封闭范围内的其他功能,如
还原io通道
功能,返回以下错误
NameError:X::Y:Module`.的未定义局部变量或方法
revert_io_channels'。我怎样才能包括所有内容,包括封闭范围(或享受它的封闭)?不要使用该gem,使用
chef-api
@coderanger:一如既往,谢谢。请您添加一个答案,以便我可以接受它?尝试了它,但它不起作用(相同的错误仍然存在)(与我的原始帖子中出现的相同错误--
NameError:X::Y::Z:Module
@MrRoth的未定义局部变量或方法“revert_io_channels”似乎
revert_io_channels
被定义为
Chef::Knife
类上的一个实例方法。该类由gem打开,该方法直接添加到o it.但是当包含
Chef::Knife::API
模块时,我认为您无法访问您范围内的
Chef::Knife
方法。这似乎是gem的一个问题。我希望我能深入挖掘,但目前我不能,sorry@MrRoth换句话说,gem应该在
Chef::Kn中定义一些方法ife::API
模块,而不是
Chef::Knife
类。看看这个gem的原始repo。
revert\u io_通道
方法是对最初在
Knife\u capture
主体中的流程的抽象。但是
revert\u io_通道
是在模块无权访问的范围内定义的。Th这是我最好的猜测wrong@MrRoth我又挖了一点,更新了答案,并提出了一个我认为确实有用的建议。让我知道它是否真的起作用了,它是否不起作用(同样的错误仍然存在)(与我的原始帖子中出现的相同错误--
NameError:X::Y::Z:Module
@MrRoth的未定义局部变量或方法“revert_io_channels”似乎
revert_io_channels
被定义为
Chef::Knife
类上的一个实例方法。该类由gem和t打开。)