YAML 校验器与 Linter

输入时即检查 YAML 语法,给出每个问题的行号和通俗解释,并对 PyYAML、Go 等 YAML 1.1 解析器解读不同的值发出警告。

输入
输出

    数据不会离开你的浏览器。快捷键:Ctrl/⌘ + Enter 执行主操作。

    什么是 YAML 校验器?

    YAML 校验器会解析 YAML 文档,报告它是否符合 YAML 1.2 规范;如果不符合,指出在哪里、为什么出错。由于 YAML 用缩进和少数标点符号表示结构,大多数错误都来自空白,很难看出来。本校验器会给出每个错误的行号和列号、通俗的解释、解析器原始的错误信息供参考,以及针对最常见原因的提示。

    如何校验 YAML

    1. 粘贴 YAML或打开文件,输入时会自动检查。
    2. 查看状态栏:绿色表示合法(显示文档数、键的数量和嵌套深度),黄色表示有警告,红色表示有错误。
    3. 点击某个问题,即可在编辑器中跳转到该处。
    4. 合法后,可以格式化,或用 YAML 转 JSON 进行转换。

    常见 YAML 错误

    问题示例修复方法
    用制表符缩进␉image: nginx只用空格缩进
    冒号后缺少空格replicas:3replicas: 3
    缩进不一致同级键缩进 2 个空格,某个键却缩进了 3 个与同级键对齐
    流式集合未闭合ports: [80, 443ports: [80, 443]
    值以保留字符开头user: @adminuser: "@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 解析器按另一种方式解读。给它们加上引号,所有解析器就能达成一致。

    示例

    spec:
      replicas:3
      template:
        spec:
          containers:
            - name: web
    	  image: nginx

    校验器会报告:第 2 行冒号后缺少空格,因此 YAML 把 replicas:3 当作一个字符串;第 7 行用了制表符缩进。两处都修好后,文档即可正常解析。

    YAML 校验器常见问题

    YAML 看起来没问题,为什么不合法?

    通常是因为看不见的空白:缩进里有制表符、某行比同级多缩进或少缩进了一个空格,或者冒号后缺少空格(key:value)。校验器会定位到具体的行并指出问题。

    什么是“挪威问题”?

    在 YAML 1.1 中,未加引号的 yes、no、on、off、y 和 n 都是布尔值,所以国家代码列表中的 NO(挪威)会变成 false。YAML 1.2 修复了这个问题,但 PyYAML、Ruby 和许多工具仍然遵循 1.1。校验器会对这些值发出警告,提醒你加上引号。

    能校验 Kubernetes、Docker Compose 或 GitHub Actions 文件吗?

    它校验的是 YAML 语法,而这些文件中的大多数错误正是语法错误。它不检查特定工具的 Schema,例如某个 Kubernetes 字段名是否存在;语法没问题后,请使用 kubectl --dry-run、docker compose config 或该工具自带的 Linter 做进一步检查。

    YAML 中重复的键算错误吗?

    算。YAML 规范要求映射的键必须唯一,本校验器会把重复的键报告为错误。有些解析器会默默接受并保留最后一个值,从而掩盖 bug。

    能校验包含多个文档的文件吗?

    可以。用 --- 分隔的每个文档都会被校验,状态栏会显示找到了多少个文档。

    为什么 3.10 会收到警告?

    未加引号的 3.10 是数字,会被读作 3.1,末尾的零丢失了。这会破坏版本字符串,例如 CI 矩阵中的 Python 版本。请加上引号:"3.10"。