加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在厨师ruby_block中要求我的图书馆

发布时间:2020-12-16 20:15:32 所属栏目:百科 来源:网络整理
导读:我正在开发一本菜谱来部署一个简单的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 g
我正在开发一本菜谱来部署一个简单的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:undefined方法’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中要求模块.

谢谢!

解决方法

根据加载顺序,您可能将您的模块包含在匿名的Ruby类中,而不是您的想法.

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

include AppHelper

您也可以使用:在您的图书馆的最后发送:

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

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

这就是你应该需要做的,除非你想在not_if和only_if的守卫中使用帮助器.那么你需要在资源中包含助手:

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

好的,现在我解释了这一切,实际上并不会帮助你. Ruby Block提供程序简单地是calls the block – 它不实例eval它.所以在资源中包含帮助者并没有做任何事情.

所以,在这种情况下你需要使用一个单例对象(这是唯一可以想到的解决方案).您定义方法的方式,可以直接从全局命名空间中调用它:

AppHelper.find_gem('...')

所以:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读