Chef infra 如何在chef ruby_block中要求我的库

Chef infra 如何在chef ruby_block中要求我的库,chef-infra,cookbook,Chef Infra,Cookbook,我正在开发一本食谱来部署一个简单的ROR应用程序。我编写了一个app_helper.rb并将其放入我的烹饪书的libraries目录中,内容如下: module AppHelper def self.find_gem if File.exists?("/usr/local/rvm/bin/rvm") return `/usr/local/rvm/bin/rvm default exec which gem`.chomp else

我正在开发一本食谱来部署一个简单的ROR应用程序。我编写了一个app_helper.rb并将其放入我的烹饪书的libraries目录中,内容如下:

module AppHelper

    def self.find_gem
      if File.exists?("/usr/local/rvm/bin/rvm")
        return `/usr/local/rvm/bin/rvm default exec which gem`.chomp
      else
        return "/usr/bin/gem"
      end
    end
  end
在recipes/default.rb中,我将上述模块混合到Chef::Recipe类中

class Chef::Recipe
  include AppHelper
end
正如您所知,find_gem函数可以从配方的任何地方调用

当我尝试在ruby_块中使用find_gem函数时,如下所示:

ruby_block "find gem" do
   block do
    gem_bin = Chef::Recipe::find_gem
    # or gem_bin = find_gem
  end
end
我得到了一个命名错误:未定义的方法“find_gem”

还要尝试将模块混合到Chef::Resource::RubyBlock中,它也不起作用

class Chef::Resource::RubyBlock
  include AppHelper
end

ruby_block "find gem" do
   block do
    gem_bin = Chef::Resource::RubyBlock::find_gem
    # or gem_bin = find_gem
  end
end
有没有办法从ruby_块调用模块中的函数?或者有一个chef变量来定位库中的文件,这样我就可以在ruby_块中要求模块


谢谢

根据加载顺序,您可能会将模块包含到一个匿名Ruby类中,而不是您所想的

如果您想在配方中使用您的方法,请在配方顶部执行以下操作:

include AppHelper
您也可以在库的末尾使用
:send

Chef::Recipe.send(:include, AppHelper)
这是不同的,因为如果未定义
Chef::Recipe
,则会引发异常(如果不存在,则创建一个新类)

除非您想在
not\u if
only\u if
中使用帮助程序,否则您只需要这样做。然后,您需要在资源中包含帮助器:

Chef::Resource.send(:include, AppHelper)

好吧,既然我解释了所有这些,它实际上对你没有帮助。Ruby块提供程序很简单——它不会对其进行实例求值。因此,将助手包含在资源中不会产生任何作用

因此,在这个实例中需要使用单例对象(这是我能可靠想到的唯一解决方案)。按照您定义方法的方式,您可以直接从全局命名空间调用它:

AppHelper.find_gem('...')
因此:


确保您将模块混入
Chef::Resource
中,而不是像代码实际所说的那样混入
Chef::Recipe
。哎呀……这是我的输入错误。这应该是厨师的食谱。实际上,我已经尝试将模块混合到Chef::Resource::RubyBlock中。通过dot调用该方法如何<代码>厨师::资源::RubyBlock。查找宝石非常感谢您的回答。这真的帮助我理解了。库中定义的库是自动需要的,并且将在本烹饪书的上下文中可用,正如您所说,它可以从全局名称空间调用。顺便说一下,我没有15个声誉投票支持您的答案,很抱歉。嘿嘿。很好-很快就会到来:)@Xiaoming如果你发现自己需要使用gems,请查看我的博客帖子:
ruby_block "find gem" do
  block do
    gem_bin = AppHelper.find_gem('...')
  end
end