开发者工具·语法转换器
通过将 YAML 缩进错误转换为 JSON 来调试它
· 为什么它很重要
yaml json 调试
YAML 缩进错误通常会产生结构错误的有效文件,而不是解析错误。这篇文章展示了如何转换为 JSON 来准确暴露解析器所理解的内容,因此错误放置的密钥变得显而易见。
从未运行的步骤 - 解析良好的工作流程文件和最终一级过高的密钥
将 `with` 放置在步骤旁边而不是步骤内部时,工作流可以成功解析。然后,跑步者稍后会忽略或拒绝该形状,并且目视检查会错过该转变,因为源仍然整洁。转换为 JSON 通过大括号和数组边界公开实际的父级。
ToolAcre 报告格式错误的 YAML 包含行和列,但有效的错误结构不会产生语法错误。因此,转换后的树是一个诊断视图:它告诉您此解析器接受的内容,而不是工作流程模式的意图。
为什么缩进错误通常不是错误 - YAML 的结构是空格,因此移位的行通常会创建一个有效但不同的文档
空白承载 YAML 层次结构。向左移动一行可以将孩子变成兄弟姐妹;移动破折号可以将项目放置在另一个序列中。两个文档都可以满足 YAML 语法。语法验证无法决定哪个嵌套与应用程序匹配。
缩进中的制表符被解析器拒绝并接收一个位置。产生错误的有效层次结构的空间需要进行结构比较。这种差异解释了为什么某些缩进错误会立即失败,而另一些缩进错误则会一直存在,直到应用程序行为为止。
JSON 明确表示的内容 — 大括号和方括号精确显示键属于哪个对象
JSON 用大括号写入对象边界,用方括号写入数组成员。错误放置的 YAML 键出现在您期望的对象之外,并且破折号成为难以忽视的数组边界。漂亮的 JSON 中的缩进是表示;标点符号定义了结构。
该视图还显示已解析的类型。在所选模式下,未加引号的标量可以为空、数字或布尔值。在不检查值的情况下修复层次结构可能会留下第二个错误,因此请比较属性路径和 JSON 类型。
错误的常见形式 — 列表项位于错误的父级下、成为同级而不是子级的键以及与空格混合的制表符
常见错误包括序列项与错误列表对齐、映射键缩进到同级项以及制表符与空格混合。重复的键是另一个陷阱:ToolAcre 保留最后一个值并发出位置警告,因此 JSON 仅包含幸存的属性。
锚点可以使结果看起来更大,因为别名会扩展为重复数据。这是此转换的预期结果,不应与意外缩进相混淆。在将每个结构差异归因于空格之前,请先阅读警告。
工作示例:具有一个错误缩进的“with”块的 CI 工作流程 — 转换为 JSON,发现放错位置的密钥,修复并重新转换
使用 `steps`、一个 `uses` 条目和一个 `with` 映射创建一个编辑作业。减少 `with` 的缩进,使其成为 `steps` 的同级,然后进行转换。 JSON 大括号表明 `with` 属于作业而不是步骤对象。将其移至列表项下方并重新转换以查看预期的嵌套。
此示例避免声明特定 CI 服务如何响应,因为转换器不会加载该架构。证明是解析的层次结构。随后应进行架构验证,然后报告 `with` 是否在正确的路径上被接受。
使用反向转换 — JSON 到 YAML 来生成可以粘贴回的正确缩进版本
一旦 JSON 结构正确,将其转换回 YAML 会从序列化器中产生一致的缩进。不明确的字符串可能会获得引号,并且注释不会被恢复。将输出视为干净的数据序列化,而不是保留源的格式化程序。
如果原始注释解释了操作选择,请将更正的结构复制到维护的文件中,而不是盲目替换它。生成的文件可能结构正确但编辑不完整。
这不包括什么 - 针对工作流或清单模式的语义验证,它捕获未知的键而不是放错地方的键
不涉及工作流程、Compose、Kubernetes 或应用程序模式。密钥可能位于目标父项下方,但仍然拼写错误或不受支持。语法转换器仅证明 YAML 被接受并显示生成的 JSON 形值。
使用所属平台的验证器来处理未知密钥、必填字段和语义约束。将语法和模式检查分开可以产生更清晰的故障,并避免将通用转换器归功于它不具备的领域知识。
要点:当 YAML 看起来正确但行为错误时,将其视为 JSON — 以及语法转换器面板如何立即执行此操作
当 YAML 看起来正确但行为错误时,检查解析树。 JSON 大括号和方括号使出身明确,而 ToolAcre 的警告会暴露重复项、流和值更改,这些可能会使情况变得复杂。
修复一个层次结构错误,重新转换,然后运行架构验证。该序列将不可见的空白怀疑转变为可观察的结构,而不声称成功的转换使得配置对其目标有效。
在比较之前和之后时,请关注属性路径而不是行号,因为序列化可以重新排序表示或添加引号。有用的评论列出了预期的路径、其 JSON 类型以及它是否位于对象或数组内。即使第一个视觉症状已修复,该小清单也会捕获第二个放错位置的密钥,并且它避免将生成的 YAML 格式转换为测试预言。