反串注意!
接觸 YAML 大概是因為遇到 docker 和 kubuernetes 的關係,因為設定檔都必須使用 YAML,然後受到各種荼毒。
先來看一下 spec。
YAML 目前支援常見的幾種資料型態:
- 整數:
100
、-100
、不同進位的表示法0xC
- 浮點數:`1230.15`、
12.3015e+02
、負無限-.inf
、以及非數字.nan
- boolean:
true
、false
- 字串:不加上引號的字串
John
、加上引號"John"
或'John'
先到這邊即可,其他容器類型的陣列、物件這邊先不討論。
這邊先來看一下可能會遇到的問題這個描述:
Name: Zeroplex version: 3.2.9 stable: 3.2
這邊使用 Symfony\Component\Yaml
來 parse 上面的設定,結果為:
array(3) { 'Name' => string(8) "Zeroplex" 'version' => string(5) "3.2.9" 'stable' => double(3.2) }
二個版本號,一個是字串,一個是數字。
為什麼會這樣?YAML 中並沒有規範怎麼樣的文字會應該是數字、什麼狀態是文字。也就是說如果字串沒有加上引號時,依照不同的 parser 實作方式,可能會有不同的結果。
這就是規範不明確導致的 undefine behaviour,最慘的是不同的 parser 實作方式不同,因此相同的設定檔使用不同的 parser 可能會被轉譯成不同的內容,而且無法誤測。
上述指示其中一個小問題,如果你想知道其他的問題,可以參考 The yaml document hell 這篇文章,設計不良讓大家都下地獄。
除了 YAML 以外,其實還有不少設計很好的語言,可以用來協助標示設定、狀態:
- JSON:以電腦讀取為主,不適合人類閱讀
- XML:同上
- TOML:語法簡單適合人類閱讀,電腦也不需要費力 parse
只因為 YAML 定義不明確,浪費幾個工作天除錯,真是浪費生命。