从Chef's Supermarket安装/下载食谱时,某些食谱确实包含metadata.json文件,但不包含metadata.rb文件。
如果没有metadata.rb 文件,用户无法将菜谱上传到厨师服务器。我的问题有两个:
这是在我的工作站上运行的 ChefDK 版本:
这是我用来从超市获取食谱的命令和食谱:
网址:https://supermarket.chef.io/cookbooks/jenkins#readme
感谢您的帮助。我在 Chef 的文档中找不到太多关于使用不包含metadata.rb 文件的食谱的信息。据我所知,每本食谱都应该在每个食谱目录中都有一个metadata.rb 文件。
强有力的文字好吧,所以这需要一些历史课来解释。早期,每个人都通过使用网络表单并上传 tarball 手动将食谱上传到超市(当时的社区网站)。这很糟糕,所以我们添加了一个 API 和一个 CLI 命令
knife cookbook site share
。该命令的工作原理基本上与 knife cookbook upload
类似,因为它是为“chef-repo”monorepo 风格设计的,其中所有食谱都位于名为“cookbooks/”的单个文件夹中。随着 Berkshelf 获得关注,越来越多的人开始将每本食谱放在自己的存储库中并单独使用它们。这使得knife cookbook site share
变得更难使用,因此编写了一个新工具:stove
。 Stove 试图纠正 knife cookbook site share
中的一系列问题,其中之一就是动态元数据的持续问题。一些精美的食谱使用 thor-scmversion 等工具来管理食谱元数据,这意味着metadata.rb 有一行看起来基本上像version IO.read('VERSION')
。还有其他示例,但简短的版本是,如果metadata.rb包含动态代码,您不希望在发布后重新运行该动态内容,因为它可能无法在您的计算机上运行(就像它使用某些文件一样)或仅存在于食谱作者机器上的工具)。当时,强制 Chef 世界中的所有内容不运行metadata.rb 的唯一方法是不将其包含在上传中,而只包含已编译的metadata.json。
我们就到这里了。
knife cookbook site share
通常只上传 .rb
而不是 .json
,而 stove
则相反。我们现在已经修复了整个生态系统中的问题,以了解 如果metadata.rb 和metadata.json 都存在,则更喜欢 JSON。计划是修复上传者以全部上传这两个文件,但目前我们仍坚持差异。
也就是说,您实际上不需要任何元数据。rb,您可以仅使用 JSON 上传到 Chef 服务器,Berkshelf 和策略系统都会为您自动执行此操作。
metadata.rb
;它们很容易创建。但是,基于此错误报告;
metadata.json
也应该有效。另外,正如您通过查看厨师来源可以看到的那样;两者都应该有效。
.json
或
.rb
。
metadata.json
或
metadata.rb
的食谱时,您可以选择:
metadata.rb
。