YAML校验

把 YAML 配置粘进来,本页逐行检查制表符缩进、缩进倍数、冒号与列表符号的空格、引号配对和同层重复键,每条问题都写明行号,方便回到编辑器直接改。

检查口径:逐行静态扫描,7 条规则各查各的,不做完整 YAML 解析,也不展开锚点与别名。示例文本里第 15 行用的是制表符缩进,第 11 行末尾带空格,第 12 行引号没闭合,第 16 行冒号后缺空格,第 9 与第 10 行同层重复定义 port。

使用方法

YAML校验把「配置为什么加载不了」拆成一条条带行号的提示,四步:

  1. 把配置粘进左侧文本框,演示默认是一段 16 行的样例,里面故意埋了 5 个问题。
  2. 点「开始校验」,或者按 Ctrl 加回车(文本框里回车留给换行,不触发校验)。
  3. 结果区按行号从小到大列出每个问题,每条都写明是第几行、错在哪、该怎么改。
  4. 点「复制报告」把整份问题清单拷到剪贴板,回到编辑器按行号逐个修。

页面打开时就先对样例跑了一次,所以你一进来看到的就是「16 行、检出 5 个问题」的真实结果,而不是空列表。

YAML校验能解决什么

它解决「YAML 报错只说第几行附近有问题、却不告诉你哪里不对」这件事,三类场景最常见:

  • 写 CI 或部署配置的:流水线配置一有缩进问题就整体启动失败,先用本页扫一遍能省下反复推送的时间。
  • 手改配置文件的:从别处复制一段进来,缩进用了 Tab,肉眼完全看不出来,本页会直接点名第几行。
  • 校对别人交来的配置:同层重复定义了两个同名键,解析器通常默默取最后一个,本页会把它揪出来。

它不做三件事:不重新排版(要重排请用 YAML 格式化工具)、不校验值的类型是否合法、不做完整语法解析。它只查「书写层面」的毛病,这些都是最容易被忽略、也最容易让整份配置报废的毛病。

原理和变量

① 逐行扫描怎么定位问题:把文本按换行切成行数组,行号从 1 开始,与编辑器左边显示的行号一一对应。报告里直接给行号而不给字符偏移,是因为修 YAML 都是回到编辑器按行改,字符偏移没有实用价值。

② 制表符为什么直接判错:YAML 规范明令禁止用 Tab 做缩进,只接受空格。这一条违反的后果最严重,因为 Tab 在编辑器里往往显示成 4 个或 8 个空格的宽度,肉眼看跟空格一模一样。本页遇到行首 Tab 就直接报错,并且跳过这一行的其余检查,避免同一行刷出好几条提示。

③ 缩进倍数为什么按 2 判断:这是个启发式。YAML 本身只要求同层对齐,并不强制 2 个空格。但实际配置里绝大多数用的是 2 的倍数,一旦出现 3 个空格,几乎都意味着这一行漏打或多打了一个空格。所以本页把它当疑点报出来,措辞是「不是 2 的倍数」而不是「非法」。

④ 冒号后为什么必须有空格:在 YAML 里冒号是映射的分隔符,但只有当它后面跟着空格或换行时才算分隔符。key:1 会被整体当成一个普通字符串标量,而不是「键 key、值 1」;解析出来的结构和你以为的完全不同,而且往往不报错,只是值悄悄错了。

⑤ 列表符号的判据:短横线只有在后面跟空格或位于行尾时才是列表项的开始,-item 会被解析成字符串「-item」而不是一个列表元素的「item」。本页用负向断言排除掉后面已经带空格的正常写法,所以标准的 - item 不会误报。

⑥ 重复键与引号配对怎么查:重复键用「缩进层级的空格数 + 键名」拼成联合键,同一层第二次出现就报,并指出第一次出现在第几行——不同层级出现同名键是合法的,所以必须把缩进算进去。引号配对则统计每行双引号个数,奇数即视为未闭合,它能抓住「引号只写了一半」这种最容易漏的错,代价是不理解转义,遇到字符串里合法出现的转义双引号会误报,这时请忽略该条。需要说明的是,这 7 条规则之外的东西本页一概不查:锚点与别名的引用是否存在、标签类型对不对、多行块标量的内容、值该是数字还是字符串,都要靠真正的解析器判断。

完整示例

演示文本共 16 行,逐一跑下来检出 5 个问题:

  • 第 11 行「debug: true 」末尾有多余空格——值本身是对的,但那一个看不见的空格会被并进字符串,导致和预期值比较时判定为不相等。
  • 第 12 行「desc: "未闭合的引号」双引号数量为奇数,引号未闭合——解析器会把后面所有内容都当成这个字符串的一部分,于是整份配置的结构全部错位。
  • 第 15 行用的是制表符缩进,YAML 只接受空格——这一行在编辑器里看起来是缩进过的,实际用的是 Tab。
  • 第 16 行「key:缺少空格」冒号后缺少空格——它会被当成一个普通标量,而不是一个键值对。
  • 第 10 行与第 9 行在同一缩进层级重复定义键「port」——两行都缩进 2 个空格、都叫 port,多数解析器会取最后一个 8082,第一个 8081 被静默丢弃。

另外注意第 13 行的「items:」下面第 14 行是按 2 个空格正确缩进的列表项,它没有被报错——这就是本页该有的样子:正常写法不制造噪音,只把真正可疑的地方挑出来。

输入范围与对照表

下表列出 18 种常见的 YAML 书写错误与修复做法,前 12 行直接展开,余下 6 行点「加载更多」。最后一列标明本页的 7 条规则是否覆盖该现象:

18 种常见 YAML 书写错误与修复对照(前 12 行展开,余下 6 行点「加载更多」)
序号错误现象触发写法修复做法本页是否检出
1用制表符缩进行首敲一个 Tab 键统一改成两个空格检出
2缩进宽度不是 2 的倍数行首排了 3 个空格改成 2 个或 4 个空格检出
3行尾留下多余空格冒号后的值结尾带空格删掉行尾的空白检出
4冒号后缺少空格key:1key: 1检出
5列表符号后缺少空格-item- item检出
6双引号没有闭合desc: "abcdesc: "abc"检出
7同一层重复定义同一个键两行都写 port:改键名或合并成一行检出
8用全角冒号当分隔符key: 1改成半角冒号不检出
9用等号代替冒号key = 1改成 key: 1不检出
10值里有未加引号的井号网址片段直接写整段加双引号包裹不检出
11单引号里又出现单引号it's 外面再包单引号改用双引号包裹不检出
12数字写成前导零010写成 10不检出

输入范围:文本行数建议不超过 2000 行、单行不超过 5000 个字符,再长浏览器渲染报告会变慢。表里 18 种现象中,前 7 类加上第 17 类共 8 种由本页的 7 条规则覆盖(第 17 类是被「制表符缩进」那条规则顺带抓到的);剩下 10 种属于语义层的问题,比如全角冒号、等号当分隔符、前导零被当八进制,都必须靠真正的 YAML 解析器才能发现。本页会如实告诉你「没检出」,而不是假装全部检查过。

结果边界和舍入

三条边界,看报告之前先知道:

  • 没报错不等于配置正确:本页只查书写层面的毛病。键名拼错、值写成字符串却该是数字、引用了不存在的锚点,这些它一律不报。报告为空只说明「没有本页能查出的那 7 类问题」。
  • 缩进倍数那条是启发式,可能误报:如果你确实在用 3 个空格的缩进风格,那一列会持续亮红。它是「疑点提示」而非「语法错误」,你可以整体忽略这一类,不影响其他规则。
  • 引号配对不理解转义:字符串里合法出现的转义双引号会被算进个数,从而产生一条误报。遇到这种情况以解析器的结论为准。本页不做完整解析,也就不承担完整解析的准确性。

常见问题

我的配置会上传吗?

不会。逐行检查全在浏览器里完成,配置内容不会离开你的设备,关掉页面就没有了。

为什么说制表符缩进是错的?

YAML 规范禁止用 Tab 做缩进,只接受空格。麻烦的是 Tab 在编辑器里常常显示成 4 个或 8 个空格的宽度,肉眼和空格一模一样,所以本页直接点名行号。

缩进必须是 2 个空格吗?

不是。YAML 只要求同一层级的键左对齐,用几个空格都行。本页按 2 的倍数做启发式提示,出现 3 个空格会当疑点报出来,但它是提示而非语法错误。

冒号后面为什么一定要加空格?

因为只有冒号后跟空格或换行时,YAML 才把它当键值分隔符。写成 key:1 会被当成一个普通字符串,解析结果和你以为的完全不同,而且常常不报错。

同层重复键为什么算问题?

两份定义只有一个能生效,多数解析器取最后一个并静默丢弃前面的。写配置的人常常以为是第一个生效,于是改了半天发现没效果,所以本页把它列出来。

能自动修复这些问题吗?

不能。本页只诊断不修改。修复方式随场景不同而不同——比如重复键是要改名还是合并,只有你知道哪份是对的。需要自动重排缩进请用 YAML 格式化工具。

为什么不直接用解析器判断?

解析器只给你一句「第几行附近有问题」,甚至什么都不说。本页的目标是把常见书写毛病拆成带行号的具体提示,两者互补:先用本页扫一遍,再交给解析器做最终判定。

报告怎么保存?

点「复制报告」把问题清单拷到剪贴板,粘进你的 issue 或聊天窗口发给同事。页面本身不落盘,也不保存历史记录。

相关工具