Chef 库发布从 Chef 12 到 Chef 14 的转换

Chef libraries issue converting from Chef 12 to Chef 14

我们公司正在从 Chef 12 (12.19.36) 更新到 Chef 14 (14.14.25)。我有一个带有辅助函数库的食谱,它周围有以下代码:

require 'chef/mixin/shell_out'

module My
  module Helpers
    include Chef::Mixin::ShellOut

     def my_method
       ...
     end
  end
end

Chef::Resource.send(:include, My::Helpers)
Chef::Recipe.send(:include, My::Helpers)

这些辅助方法随后会在同一配方的资源中调用,但也可以从包含此配方的其他配方(及其资源)中调用。因此,据我了解,为什么我要发送给所有 Chef::Resource 和 Chef::Recipe。但我应该声明我不是 Ruby 程序员所以我的理解 none 太深了。

无论如何,这在我们的 Chef 12 客户端上运行良好,但现在在 Chef 14 上出现问题,调用 'my_method' 时出现 NoMethod 错误。 (这是在调用这个配方时,甚至不考虑另一个配方是否正在调用它。)这是完整的错误,一些命名被掩盖了。

    NoMethodError
    -------------
    undefined method `my_method' for #<#<Class:0x0000000003d9fd98>:0x0000000004c56aa8>

    Cookbook Trace:
    ---------------
    /var/chef/cache/cookbooks/my_test_recipe/resources/default.rb:10:in `block in class_from_file'

    Resource Declaration:
    ---------------------
    # In /var/chef/cache/cookbooks/my_test_recipe/recipes/default.rb

     53: call_to_my_resource propertyname
     54:

    Compiled Resource:
    ------------------
    # Declared in /var/chef/cache/cookbooks/my_test_recipe/recipes/default.rb:53:in `from_file'

我看了很多其他内部食谱,没有两个是相同的,每个人做事的方式都不一样。例如,许多示例可能会直接在资源文件中包含帮助程序,但这将不允许其他不需要该资源的配方直接调用该方法。 (他们确实调用了资源,但也需要直接调用辅助方法。)解释这些的在线文档很少。

我做了更多的研究,并根据一些提示,添加了一行:

Chef::Provider.send(:include, My::Helpers)

这在帮助程序库文件的底部,连同相应的“发送”到资源和配方。我不能说我完全理解它,但我认为我的自定义资源是提供者 class 而不是资源 class?我会喜欢任何可以帮助我更好地理解这一点的评论。由于使用辅助函数的位置,我仍然需要保留其他行。