什么是 YAML 校验器?
YAML 校验器会解析 YAML 文档,报告它是否符合 YAML 1.2 规范;如果不符合,指出在哪里、为什么出错。由于 YAML 用缩进和少数标点符号表示结构,大多数错误都来自空白,很难看出来。本校验器会给出每个错误的行号和列号、通俗的解释、解析器原始的错误信息供参考,以及针对最常见原因的提示。
如何校验 YAML
- 粘贴 YAML或打开文件,输入时会自动检查。
- 查看状态栏:绿色表示合法(显示文档数、键的数量和嵌套深度),黄色表示有警告,红色表示有错误。
- 点击某个问题,即可在编辑器中跳转到该处。
- 合法后,可以格式化,或用 YAML 转 JSON 进行转换。
常见 YAML 错误
| 问题 | 示例 | 修复方法 |
|---|---|---|
| 用制表符缩进 | ␉image: nginx | 只用空格缩进 |
| 冒号后缺少空格 | replicas:3 | replicas: 3 |
| 缩进不一致 | 同级键缩进 2 个空格,某个键却缩进了 3 个 | 与同级键对齐 |
| 流式集合未闭合 | ports: [80, 443 | ports: [80, 443] |
| 值以保留字符开头 | user: @admin | user: "@admin" |
| 重复的键 | name: a … name: b | 只保留其中一个 |
| 别名引用了未定义的锚点 | <<: *defaults,但没有 &defaults | 在上方定义该锚点 |
Linter 会警告的 YAML 1.1 陷阱
下面这些值是合法的,但含义取决于解析器。YAML 1.2(本工具以及 eemeli/yaml、Go 的 yaml.v3 等现代库所用)按一种方式解读;PyYAML、Ruby 的 Psych 和 Go 的 yaml.v2 等 YAML 1.1 解析器按另一种方式解读。给它们加上引号,所有解析器就能达成一致。
- yes / no / on / off / y / n:在 1.2 中是字符串,在 1.1 中是布尔值。经典例子是国家代码
NO。 - 前导零,如
0755或邮政编码02134:前导零会被丢掉,而 1.1 解析器会把它当作八进制。 - 冒号分隔的数字,如端口映射中的
22:22:在 YAML 1.1 中是六十进制整数,这也是 Docker 文档要求给端口加引号的原因。 - 形似版本号的小数,如
3.10:会被当作浮点数,版本号变成 3.1。
示例
spec:
replicas:3
template:
spec:
containers:
- name: web
image: nginx
校验器会报告:第 2 行冒号后缺少空格,因此 YAML 把 replicas:3 当作一个字符串;第 7 行用了制表符缩进。两处都修好后,文档即可正常解析。