Linux中國

讓 YAML 變得像它看起來一樣簡單

如果你曾經嘗試過寫 YAML,你可能一開始會對它看起來很容易感到高興。乍一看,經常用於配置文件、Ansible 劇本和普通文件資料庫的 YAML 看起來就像購物清單一樣直觀。然而,YAML 的結構中有很多細微的差別,它隱藏著一個危險的秘密:YAML 實際上是一種高度精確、結構化和令人驚訝的嚴格語言。好消息是,你只需要了解兩件事就可以知道 YAML 的工作原理。

關於 YAML 的真相是,YAML 中只有兩種數據結構: 序列 sequence 映射 mapping 。這是兩個花哨的名字,你會發現它代表了你非常熟悉的概念。這篇文章解釋了這兩種結構,更重要的是,介紹了它們是如何協同工作,使 YAML 成為表示你所關心的數據的強大方式。

YAML 序列

YAML 序列是一個列表。在其最簡單的形式中,每行有一個項目,每行以破折號和空格開始。

下面是一個例子:

- Linux
- BSD
- Illumos

不同的語言有不同的方式來表示這種數據。例如,在 Python 中,同一個列表可以寫成 ['Linux', 'BSD', 'Illumos']。當你在現實生活中寫一個列表時,例如在你去買菜之前,你寫的可能近似於 YAML 序列。

YAML 映射

YAML 映射是一個關鍵術語與該術語的定義相結合。在其他語言中,映射被稱為「鍵值對」或「詞典」。

這裡有一個例子:

Kernel: Linux
CPU: AMD
RAM: '16 GB'

不同的語言有不同的方式來表示這種數據。在 Python 中,例如,同樣的數據可以寫成 {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}。在現實生活中,你可能會使用這種結構來計劃,例如,與朋友的遊戲之夜。一個朋友報名帶零食,另一個報名帶一副牌,另一個報名帶一個棋盤遊戲,等等。

組合序列和映射

你現在知道 YAML 的語法了。序列和映射是 YAML 中僅有的兩種構件,你想在 YAML 中表示的任何東西都可以放在序列或映射中。

或者同時使用這二者!

是的,序列和映射可以被組合和嵌套,這就是 YAML 看起來很直觀,但同時又感覺很複雜的原因之一。不過,只有四種可能的組合,一旦你學會如何看它們,YAML 就會覺得像它看起來一樣簡單。

序列的映射

當你想讓一個鍵項有許多值時,你可以使用一個序列的映射。也就是說,你從一個映射(鍵)開始,但是給值一個列表:

Linux:
  - Fedora
  - Slackware
BSD:
  - FreeBSD
  - NetBSD

在這個示例代碼中,Linux 是第一個鍵,它的值是一個序列,其中包含 FedoraSlackware。第二個鍵是 BSD,它的值是一個序列,包含 FreeBSDNetBSD

映射的映射

當你想讓一個鍵項的值中既有鍵又有值時,你可以使用映射的映射。也就是說,你從一個映射(鍵)開始,但是給值另一個映射。

這可能有點欺騙性,但它揭示了 YAML 中使用特定術語的原因:因為你只不過是創建了一個映射的列表,並不意味著你創建了一個序列。這裡是一個映射的映射:

Desktop:
  CPU: RISC-V
  RAM: '32 GB'
Laptop:
  CPU: AMD
  RAM: '16 GB'

對大多數人來說,這看起來像一個列表。而且從技術上講,它是一個列表。但重要的是要認識到,它不是 YAML 序列。它是一個映射,其中包含映射。作為半個 YAML 專家,你可以從明顯缺少破折號的地方看出區別。

在 Ansible 劇本的所有結構中,我發現這個結構最容易欺騙人。作為人類,我們喜歡列表,當我們看到一個數據結構 在字面上 是列表時,大多數人會把它當成 YAML 序列。但是在 YAML 中,雖然序列是列表,但是列表並不總是序列。

序列的序列

就像你可以嵌套映射一樣,你可以將一個序列嵌套到一個序列中:

- [Linux, FreeBSD, Illumos]
- [YAML, XML, JSON]

這可能是我在 YAML 的實際使用中遇到的最不常見的數據結構,但有時你需要一個列表的列表。

映射的序列

你也可以創建一個包含映射的序列。對於人類排序數據的方式來說,這並不太常見,但對於計算機來說,這可能是一個重要的結構。

這裡有一個例子:

-
  CPU: AMD
  RAM: '16 GB'
-
  CPU: Intel
  RAM: '16 GB'

對於 YAML,這可能是最不直觀的語法。我發現它在 Python 中呈現時更清晰:

[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]

方括弧代表一個列表結構,這個列表包含兩個字典。每個字典都包含鍵值對。

構建更好的 YAML

現在你知道了 YAML 的兩個組成部分,以及它們如何被組合起來以表示複雜的數據結構。問題是:你要用 YAML 構建什麼?

和很多人一樣,我也使用 YAML 來編寫 Ansible 劇本。我還用它作為一種簡單的配置格式、作為 D&D 的角色表、表示項目組織所需的目錄結構,等等。只要你能適應序列和映射的概念,你會發現 YAML 是一種很容易編寫、閱讀和(如果有合適的庫)解析的格式。

如果你發現自己經常使用 YAML,請下載我們的 YAML 速查表,以幫助你直觀地了解基本數據結構及其組合,並幫助你記住一些額外的語法約定。通過一點點的練習,你會發現 YAML 真的和它看起來一樣簡單!

via: https://opensource.com/article/21/9/yaml-cheat-sheet

作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國