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打开。)