繁體中文

開發者工具·語法轉換器

透過將 YAML 縮排錯誤轉換為 JSON 來偵錯它

· 為什麼它很重要

yaml json 偵錯

錯誤放置的 YAML 行在明確 JSON 大括號旁邊反白顯示
原始 ToolAcre 向量圖

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 格式轉換為測試預言。