これについては外を見る必要がありますknife
。Knife はChef::CookbookLoader
(スタックを下に) デリゲートするため、クックブック ローダーを直接使用できます。
require 'chef/config'
require 'chef/cookbook_loader'
Chef::Config.from_file(path)
cookbooks = Chef::CookbookLoader.new(Chef::Config.cookbook_path).map(&:cookbook_name)
たとえば、knife-spork
このパターンを使用してクックブックをロードします。
名前だけでなく、実際のクックブック オブジェクトを取得することに注意してください。もう少し軽量なものが必要な場合は、それぞれを反復処理して、次cookbook_path
のものを探すことができmetadata.rb
ます。
# https://gist.github.com/fnichol/4343327
class MetadataChopper < Hash
def self.extract(metadata_file)
mc = new(File.expand_path(metadata_file))
[mc[:name], mc[:version]]
end
def initialize(metadata_file)
eval(IO.read(metadata_file), nil, metadata_file)
end
def method_missing(meth, *args, &block)
self[meth] = args.first
end
end
require 'chef/config'
cookbook_paths = Chef::Config.from_file(path).cookbook_path
cookbooks = Dir[*cookbook_paths.map { |p| "#{p}/**/metadata.rb" }].collect do |metadata|
MetadataChopper.new(metadata)[:name] || File.basename(File.dirname(cookbook))
end