从Chef's Supermarket安装/下载cookbook时,一些cookbook确实包含metadata.json文件,但不包含metadata.rb文件。
如果没有metadata.rb文件,则用户无法将cookbook上传到Chef服务器。我的问题有两个:
这是我工作站上运行的ChefDK版本:
这是我用来从超市购买食谱的命令和食谱:
网址:https://supermarket.chef.io/cookbooks/jenkins#readme
感谢您的帮助。我没有在Chef的文档中找到很多关于使用没有包含metadata.rb文件的cookbook的文章。根据我的阅读,每本食谱都应该有一个metadata.rb文件,位于每个食谱目录中。
答案 0 :(得分:3)
好的,所以这需要一些历史课来解释。在早期,每个人都通过使用网络表单和上传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。计划是修复上传者上传两个文件,但现在我们仍然坚持差异。
也就是说,实际上你不需要metadata.rb,你可以上传到只有JSON的Chef服务器,而且Berkshelf和策略系统都会为你自动化。
答案 1 :(得分:0)
metadata.rb
; they're easy enough to create。但是,based on this bug report; metadata.json
也应该有效。另外,正如您所见looking at the chef source;要么应该工作。.json
或.rb
。当您遇到没有metadata.json
或metadata.rb
的食谱时,您有以下选项:
metadata.rb
。您是否因尝试上传此食谱而收到错误消息?它应该工作。