Ответ 1
В зависимости от порядка загрузки вы можете включить свой модуль в анонимный класс Ruby вместо того, что вы думаете.
Если вы хотите использовать свой метод в рецепте, сделайте это в верхней части вашего рецепта:
include AppHelper
В качестве альтернативы вы можете использовать :send
в конце вашей библиотеки:
Chef::Recipe.send(:include, AppHelper)
Это другое, потому что оно вызовет исключение, если Chef::Recipe
не определено (тогда как вы создаете новый класс, если он не существует).
Это все, что вам нужно сделать, если вы не хотите использовать помощника в защитных устройствах not_if
и only_if
. Затем вам нужно включить помощника в ресурс:
Chef::Resource.send(:include, AppHelper)
Хорошо, теперь, когда я объяснил все это, это на самом деле вам не поможет. Поставщик Ruby Block просто вызывает блок - он не имеет значения для eval. Поэтому включение помощника в ресурс не делает ничего.
Итак, вам понадобится использовать одноэлементный объект в этом экземпляре (это единственное решение, о котором я могу надеяться). Как вы определили свой метод, вы можете вызвать его непосредственно из глобального пространства имен:
AppHelper.find_gem('...')
Итак:
ruby_block "find gem" do
block do
gem_bin = AppHelper.find_gem('...')
end
end