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

undefined local variable or method for extended module

注意:问题已编辑以反映问题。

我想使用 knife-api ruby​​gem。附上我的代码片段

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::Knifeknife-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-apigem。它不应该存在。如果您想从 Ruby 代码访问 Chef API 数据,正确的 gem 是 chef-api(我知道,我们在名字方面很有创意)。如果你想做一些非常小的事情,请查看 knife exec 命令,它只公开原始 Chef 对象 API(不像 chef-api 那样精致,但内置)。