在学习厨师时,我看到包装食谱的冲突模式.例如.
一些cookbook使用default.rb,而其他cookbook使用customize.rb进行覆盖.
attributes/default.rb
attributes/customize.rb
Run Code Online (Sandbox Code Playgroud)
哪个是最佳做法?
另外,一些包装器cookbook在recipes/default.rb文件中有这样的参数:
normal['foo']['bar'] = 42
Run Code Online (Sandbox Code Playgroud)
而其他人有
default['foo']['bar'] = 42
Run Code Online (Sandbox Code Playgroud)
有些人有
node.set['foo']['bar'] = 42
Run Code Online (Sandbox Code Playgroud)
此外,一些烹饪书使用符号和其他字符串
['foo']['bar']
[:foo][:bar]
Run Code Online (Sandbox Code Playgroud)
我应该使用哪种款式?
更新
看起来像大厨已经发布了官方风格指南,它至少解决了部分问题(例如符号与字符串). https://docs.chef.io/ruby.html#
Art*_*son 10
我还没有看到任何关于如何覆盖包装器烹饪书中的属性的正式最佳实践,我认为必须选择一种风格,只要你的所有烹饪书在你的组织中都是一致的,你应该是好的.以下是我的观点.
我们最初遵循分离属性文件的方式,类似于attributes/customize.rb您描述的格式.但是,我们发现保留所有属性要简单得多attributes/default.rb,特别是因为我们的属性保持在50行代码之下.
在我们的包装器cookbook中覆盖属性时,我们总是使用最低的属性优先级.我们default尽可能坚持,因为优先顺序决定了你的食谱default比包装食谱更胜一筹default.
您看到的大多数烹饪书都使用字符串访问格式.
default['foo']['bar'] = 42
Run Code Online (Sandbox Code Playgroud)
事实上,有一个食品专业规则专门阻止使用符号访问.Foodcritic还鼓励使用一致的样式来访问属性.如果你决定一种风格,请记住社区已经决定了字符串访问格式.
但是,还有另一种方式.Chef中的属性不是a Hash,它们实际上是一个Mash.Mash恰好支持以方法的形式访问属性,因此:
default.foo.bar = 42
Run Code Online (Sandbox Code Playgroud)
我们更喜欢这种语法,因为它更紧凑.
但是,要谨慎,正如Tejay Cardon指出的那样,Chef实现了这一点method_missing,因此如果属性名称与当前(或将来)node对象方法相同,则可能会遇到问题.我们用我们的组织名称为我们的所有食谱做准备,因此不太可能发生碰撞,但是当我们覆盖社区食谱时,我们可能会遇到问题.值得庆幸的是测试应该抓住任何这样的失误.
包装器手册中的覆盖属性不会以令人惊讶的方式工作,特别是涉及字符串插值时.这个博客文章很好地解释了这一点.主要要点是如果食谱将属性定义为:
default['version'] = '1.0'
default['url'] = "http://example.com/#{node['version']}.zip"
Run Code Online (Sandbox Code Playgroud)
在您的包装食谱中,您覆盖version:
default['version'] = '2.0'
Run Code Online (Sandbox Code Playgroud)
该default['url']会仍然决心http://example.com/1.0.zip,不http://example.com/2.0.zip为你所期望的.发生这种情况是因为在覆盖发生之前会对url属性进行插值.博客文章更深入,并提供了一个潜在的解决方案.
在一天结束时,有多种方法可以在Chef中做事,社区仍然日趋成熟.有关编写可重复使用的烹饪书等的一些最佳实践,但这些实践仍在不断发展.
你能做的最好的事情就是尝试各种风格,找出最适合你和你的团队的风格.一旦你决定了一种风格,我建议把风格指南放在一起(我已经用这个Angular风格指南作为灵感).您还可以使用自定义食品规则强制执行样式指南.我们用这种方法取得了成功.