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

时间:2017-07-25 08:32:30

标签: ruby chef knife

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

我想与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时,返回

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

我该怎么做才能做到这一点?

2 个答案:

答案 0 :(得分:0)

此gem是另一个不再维护的项目的分支。查看gem代码,通过对原始代码进行一些错误的重构,似乎有一些问题被引入最新版本(0.1.7)。那个版本是在一年前发布的,自那以后它还没有任何提交。回购也不接受发票,也没有测试。如果你必须使用这个gem,我会尝试一个悲观的约束gem 'knife-api', '< 0.1.7',看看是否有效。但是,完全跳过它可能是一个更好的主意。我试图解决问题并提交PR。您也可以尝试从我的分叉回购https://github.com/msimonborg/knife-api

中拉出宝石

答案 1 :(得分:0)

在完整的非答案中,请勿使用knife-api gem。它不应该存在。如果您想从Ruby代码访问Chef API数据,那么使用的正确gem是chef-api(我知道,我们是真正具有名称的创意)。如果你想做一些非常小的事情,请查看knife exec命令,该命令只公开原始Chef对象API(不像chef-api那样精致,但内置)。