【问题标题】:how to require my library in chef ruby_block如何在厨师 ruby​​_block 中要求我的图书馆
【发布时间】:2014-01-17 02:41:03
【问题描述】:

我正在开发一个说明书来部署一个简单的 ROR 应用程序。我写了一个 app_helper.rb 并把它放在我的食谱的库目录中,这是内容:

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​​_block 中使用 find_gem 函数时:

ruby_block "find gem" do
   block do
    gem_bin = Chef::Recipe::find_gem
    # or gem_bin = find_gem
  end
end

我收到了 NoMethodError:未定义的方法“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_block调用模块中的函数?或者是否有一个厨师变量来定位库中的文件,这样我就可以在 ruby​​_block.

谢谢!

【问题讨论】:

  • 确保将模块混入Chef::Resource,而不是像您的代码实际所说的那样混入Chef::Recipe
  • 糟糕...这是我的错字。应该是 Chef::Recipe。实际上,我已经尝试将模块混合到 Chef::Resource::RubyBlock 中。
  • 通过dot调用方法呢? Chef::Resource::RubyBlock.find_gem

标签: chef-infra cookbook


【解决方案1】:

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

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

include AppHelper

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

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

这是不同的,因为如果未定义Chef::Recipe,它将引发异常(而如果它不存在,则您正在创建一个新类)。

这就是你需要做的所有事情,除非你想在not_ifonly_if 守卫中使用助手。然后你需要在资源中包含帮助器:

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

好的,既然我已经解释了所有这些,它实际上对您没有帮助。 Ruby Block 提供者只是calls the block - 它不会实例化它。因此,在资源中包含帮助器不会做任何事情

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

AppHelper.find_gem('...')

所以:

ruby_block "find gem" do
  block do
    gem_bin = AppHelper.find_gem('...')
  end
end

【讨论】:

  • 非常感谢您的回答。它真的帮助我理解。库中定义的库是自动需要的,并且将在本食谱的上下文中可用,正如您所说,它可以从全局命名空间中调用。
  • 顺便说一句,我没有 15 名声望来投票赞成你的答案,很抱歉。
  • 嘿。没关系 - 它很快就会到来:)
  • @Xiaoming 如果您发现自己需要使用 gems,请查看我的博文:sethvargo.com/using-gems-with-chef
猜你喜欢
  • 2015-05-04
  • 2015-11-02
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多