扩展模块的未定义局部变量或方法
undefined local variable or method for extended module
注意:问题已编辑以反映问题。
我想使用 knife-api
rubygem。附上我的代码片段
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
时,它 returns
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)
他的封闭作用域函数(Chef::Knife
在 knife-api
中)似乎在 X::Y::Z.foo
中不可访问。
我应该怎么做?
这个 gem 是另一个不再维护的项目的分支。查看 gem 代码,最新版本 (0.1.7
) 似乎通过对原始代码进行了一些不良重构而引入了几个问题。该版本是一年前发布的,此后没有任何提交。回购也不接受发行票,也没有测试。如果您必须使用此 gem,我会尝试使用悲观约束 gem 'knife-api', '< 0.1.7'
,看看是否可行。然而,完全跳过它可能是一个更好的主意。我试图解决问题并提交 PR。您也可以尝试从我的分叉回购 https://github.com/msimonborg/knife-api
中提取 gem
在完整的非答案中,不要使用knife-api
gem。它不应该存在。如果您想从 Ruby 代码访问 Chef API 数据,正确的 gem 是 chef-api
(我知道,我们在名字方面很有创意)。如果你想做一些非常小的事情,请查看 knife exec
命令,它只公开原始 Chef 对象 API(不像 chef-api
那样精致,但内置)。
注意:问题已编辑以反映问题。
我想使用 knife-api
rubygem。附上我的代码片段
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
时,它 returns
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)
他的封闭作用域函数(Chef::Knife
在 knife-api
中)似乎在 X::Y::Z.foo
中不可访问。
我应该怎么做?
这个 gem 是另一个不再维护的项目的分支。查看 gem 代码,最新版本 (0.1.7
) 似乎通过对原始代码进行了一些不良重构而引入了几个问题。该版本是一年前发布的,此后没有任何提交。回购也不接受发行票,也没有测试。如果您必须使用此 gem,我会尝试使用悲观约束 gem 'knife-api', '< 0.1.7'
,看看是否可行。然而,完全跳过它可能是一个更好的主意。我试图解决问题并提交 PR。您也可以尝试从我的分叉回购 https://github.com/msimonborg/knife-api
在完整的非答案中,不要使用knife-api
gem。它不应该存在。如果您想从 Ruby 代码访问 Chef API 数据,正确的 gem 是 chef-api
(我知道,我们在名字方面很有创意)。如果你想做一些非常小的事情,请查看 knife exec
命令,它只公开原始 Chef 对象 API(不像 chef-api
那样精致,但内置)。