Yaml 格式

Posted by Adam on August 24, 2022
YAML 的列舉最容易搞混的地方,都出在「`-` 到底跟哪個縮排層級對齊」。分三個層次來看: **1. 最單純的列表** ```yaml fruits: - apple - banana - cherry ``` `fruits` 底下有三個項目,`apple`/`banana`/`cherry` 都是字串。這個沒什麼好混淆的。 **2. 陷阱:`-` 可以不用縮排,跟父層 key 對齊也合法** ```yaml fruits: - apple - banana ``` 這樣寫**完全等價**於上面那版有縮排的寫法!YAML 規格特別把「列表」排除在縮排規則外,`-` 可以跟父層的 key 同一個縮排層級。這是大部分人覺得「有時候看起來層級怪怪的」的根源——同一份文件裡,如果不同人習慣不一樣,會看到兩種寫法混在一起,容易誤判層級。 **3. 真正容易看錯的情境:列表裡裝的是「物件」,不是字串** ```yaml servers: - name: web1 port: 8080 ssl: true - name: web2 port: 8081 ``` 這是最常讓人卡住的格式。拆解一下: - `- name: web1` 這一行:`-` 代表「這是列表的第一個項目」,項目的內容從 `name: web1` 開始——這個項目本身是一個**物件**(有 key/value),不是單純字串。 - `port: 8080` 這一行:對齊的位置是 `name` 那個字的開頭(也就是 `-` 後面那個空格再過去的位置),**不是對齊 `-` 本身**。因為對齊到 `name`,Vim/YAML 才會判斷 `port` 跟 `name` 是「同一個物件」的兩個 key,屬於**同一個列表項目**。 - 第二個 `- name: web2` 因為 `-` 的位置跟第一個 `-` 對齊(同一欄),才會被判斷成「列表的下一個項目」,不是巢狀在前一個項目底下。 **判斷口訣**:兩個 `-` 如果在同一欄(同一個縮排位置),就是「同一層列表的不同項目」;如果 `-` 縮得更進去,就是巢狀(列表中的列表,或某個 key 的值是一個列表)。至於「這個項目底下還有哪些 key」,看的是**跟在 `-` 後面第一個非空白字元的欄位**,其他行對到那個欄位,才算同一個項目。 如果不想每次數欄位,還有個取巧寫法——**flow style**(一行寫完): ```yaml servers: - {name: web1, port: 8080} - {name: web2, port: 8081} ``` 效果完全一樣,只是用大括號取代換行縮排,適合項目內容不多、想避開縮排判讀麻煩的時候用。