去掉引号就会变味的地方
YAML 会自己判断不带引号的值属于什么类型,事故往往就出在这里。
version: 1.10 被当成数字,结果是 1.1,末尾的零没了,版本号的意思也变了。zip: 01234 同样会变成数字 1234,开头的零掉了。邮政编码、工号、电话号码这类开头的零有含义的值,一定要写成 "01234"。
12:30 这样的时刻写法,以及 no、yes、on,在这个工具里都保持字符串。不过按旧规范工作的解析器,比如 PyYAML 和 Ruby,会把 no 读成假值,国家代码 NO 变成 false 就是有名的例子。配置要经过好几种工具时,这些词也一并加引号更稳妥。
缩进的规矩
缩进只能用空格,制表符会直接报语法错误。如果编辑器默认插入制表符,在 YAML 文件里改成空格。
同一层级的条目必须严格对齐,差一列就会当场解析失败。这个工具会把出错的行号和列号原样告诉你。
锚点与合并键
&名字 给一段内容起名,*名字 把它取来用。再配上 <<:,就能把那段内容倒进另一个映射里。
defaults: &d
retry: 2
image: node
job:
<<: *d
script: test
这个工具会把合并键展开,所以输出的 JSON 里 job 中会有 retry 和 image。不展开的话会留下一个叫 "<<" 的键,后面根本没法用。GitLab CI 和 Docker Compose 的配置里经常见到这种写法。
转成 JSON 会丢掉什么
注释没了。JSON 没有注释语法,把配置转过去再覆盖原文件,之前写下的说明会全部消失,所以要留着原件。
多个文档也装不下。文件里如果有用 --- 分开的多份文档,这个工具会直接报错,而不是悄悄只输出第一份、让其余的不知不觉消失。像 Kubernetes 那种一个文件装多份清单的,请拆开一份份转。
日期会变成字符串。YAML 认得日期这种类型,JSON 里没有对应的东西。
反过来转的时候
把 JSON 转成 YAML,大部分引号会去掉,读起来轻松不少。但开头带零的字符串,以及看着像 true 的字符串,引号仍然保留。去掉它们意思就变了,留着才是对的。