使用方法
YAML校验把「配置为什么加载不了」拆成一条条带行号的提示,四步:
- 把配置粘进左侧文本框,演示默认是一段 16 行的样例,里面故意埋了 5 个问题。
- 点「开始校验」,或者按 Ctrl 加回车(文本框里回车留给换行,不触发校验)。
- 结果区按行号从小到大列出每个问题,每条都写明是第几行、错在哪、该怎么改。
- 点「复制报告」把整份问题清单拷到剪贴板,回到编辑器按行号逐个修。
页面打开时就先对样例跑了一次,所以你一进来看到的就是「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 条规则是否覆盖该现象:
| 序号 | 错误现象 | 触发写法 | 修复做法 | 本页是否检出 |
|---|---|---|---|---|
| 1 | 用制表符缩进 | 行首敲一个 Tab 键 | 统一改成两个空格 | 检出 |
| 2 | 缩进宽度不是 2 的倍数 | 行首排了 3 个空格 | 改成 2 个或 4 个空格 | 检出 |
| 3 | 行尾留下多余空格 | 冒号后的值结尾带空格 | 删掉行尾的空白 | 检出 |
| 4 | 冒号后缺少空格 | key:1 | key: 1 | 检出 |
| 5 | 列表符号后缺少空格 | -item | - item | 检出 |
| 6 | 双引号没有闭合 | desc: "abc | desc: "abc" | 检出 |
| 7 | 同一层重复定义同一个键 | 两行都写 port: | 改键名或合并成一行 | 检出 |
| 8 | 用全角冒号当分隔符 | key: 1 | 改成半角冒号 | 不检出 |
| 9 | 用等号代替冒号 | key = 1 | 改成 key: 1 | 不检出 |
| 10 | 值里有未加引号的井号 | 网址片段直接写 | 整段加双引号包裹 | 不检出 |
| 11 | 单引号里又出现单引号 | it's 外面再包单引号 | 改用双引号包裹 | 不检出 |
| 12 | 数字写成前导零 | 010 | 写成 10 | 不检出 |
| 13 | 布尔值写成大写 | TRUE | 写成小写 true | 不检出 |
| 14 | 多行文本没用块标量 | 直接换行接着写 | 用竖线或大于号起头 | 不检出 |
| 15 | 键名里带冒号 | a:b: 1 | 给键名加双引号 | 不检出 |
| 16 | 注释紧贴在值后面 | 值后面直接接空格加井号 | 井号前留一个空格 | 不检出 |
| 17 | 缩进里混用 Tab 与空格 | 有的行 Tab 有的行空格 | 全部统一成空格 | 检出 |
| 18 | 文件中间又出现分隔符 | 正文里再来一行三个短横线 | 只在文件开头写一次 | 不检出 |
输入范围:文本行数建议不超过 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 或聊天窗口发给同事。页面本身不落盘,也不保存历史记录。