我有一个配方循环遍历属性中定义的一堆数据:
node["repos"].each do |repo, data|
...do stuff...
end
...do stuff...
部分相当长,我想在多个配方中重复使用它,唯一的区别是属性中的数据集不同。
我尝试将循环内部移动到另一个配方并包括它:
node["repos"].each do |repo, data|
include_recipe "other_recipe"
end
但是当它试图运行other_recipe
时,data
变量不存在。
什么是"适当的"在食谱之间共享代码的方式?
答案 0 :(得分:3)
最简单的方法是将此do stuff
移至库。
my_cookbook /库/ myhelper.rb:
module Myhelper
def do_stuff( repo, data )
[...you can use all kinds of resources here as in recipe...]
end
end
然后你可以在这样的食谱中使用这个模块:
another_cookbook /食谱/ some_recipe.rb:
extend Myhelper
do_stuff( node[:attribute1], node[:attribute2] )
只需确保在元数据中添加对my_cookbook
的依赖:
another_cookbook / metadata.rb:
depends 'my_cookbook'
答案 1 :(得分:1)
不幸的是,这不起作用,因为include_recipe
两者都不允许传递参数,并且已经去掉了#34;意味着它只对给定的食谱运行一次。
这些天最简单的选择就是制作自定义资源。其他选项包括定义和辅助方法,但我会从自定义资源开始,然后从那里开始。东西块的输入(在这种情况下为repo
和data
)成为资源属性,配方代码块进入资源的动作方法。