Mam przepis, który pętle przez grupę danych zdefiniowanych w atrybutach:

node["repos"].each do |repo, data|
  ...do stuff...
end

Sekcja ...do stuff... jest dość długa, a ja chciałbym ponownie użyć go w wielu przepisach, jedyną różnicą jest to, że dane ustawione w atrybutach są inne.

Próbowałem przesunąć wnętrze pętli na inny przepis i włączony tak:

node["repos"].each do |repo, data|
   include_recipe "other_recipe"
end

Ale kiedy próbował uruchomić other_recipe, zmienna {X1}} nie istniała.

Jaki jest "właściwy" sposób udostępniania kodu między recepturami?

1
PortMan 17 luty 2017, 01:51

2 odpowiedzi

Najlepsza odpowiedź

Najprostszą rzeczą byłoby przeniesienie tego do stuff do biblioteki.

my_cookbook / biblioteki / myhelper.rb:

module Myhelper
  def do_stuff( repo, data )
    [...you can use all kinds of resources here as in recipe...]
  end
end

Następnie możesz użyć tego modułu w takich przepisach:

inny_cookbook / recept / ate_recipe.rb:

extend Myhelper
do_stuff( node[:attribute1], node[:attribute2] )

Wystarczy upewnić się, że dodasz zależność od my_cookbook w metadanych:

inny_cookbook / metadata.RB:

depends 'my_cookbook'
3
Draco Ater 17 luty 2017, 07:23

Niestety to nie działa, ponieważ include_recipe oba nie pozwala na przekazywanie parametrów i jest "pokoził", co oznacza, że biegnie tylko raz na dany przepis.

Najbliższa opcja w tym rodzaju tej rzeczy jest stworzenie niestandardowego zasobu. Inne opcje obejmują definicje i metody pomocnicze, ale zacząłbym od niestandardowego zasobu i wyjdź stamtąd. W tym przypadku wejścia do bloku rzeczy ({x0}} i data i data) stają się właściwościami zasobów, a część kodu receptury przechodzi w metodzie działania zasobów.

1
coderanger 17 luty 2017, 00:09