Skip to content

YAML – 基础

YAML (YAML Ain’t Markup Language) 是一种人类可读的数据序列化语言。它常用于配置文件、不同语言之间的数据交换以及对象持久化。本章节涵盖 YAML 的基本规则和组成部分。

  • 大小写敏感:YAML 将 key 和 Key 视为不同的键。
  • 文件扩展名:YAML 文件通常使用 .yaml 或 .yml 作为扩展名。
  • 缩进:结构由缩进定义。关键的是,使用空格进行缩进,而不是制表符。使用制表符可能导致解析错误或在不同系统和编辑器之间产生不一致的行为。
  • 缩进一致性:同一块内每个缩进级别的空格数必须一致。两个空格是常见的约定,但任何数量都可以,只要它保持一致。

YAML 主要使用三种基本结构类型:

1. 映射(键值对 / 字典 / 对象)

Section titled “1. 映射(键值对 / 字典 / 对象)”

映射表示键值对,类似于 Python 中的字典或 JavaScript 中的对象。每个键后面跟着一个冒号和一个空格,然后是其值。

# 块式映射
name: John Smith
age: 33
occupation: Software Engineer

序列表示有序的项目列表。在块式风格中,序列中的每个项目都以一个破折号和一个空格(- )开头。

# 块式序列
# 喜欢的电影
- Casablanca
- North by Northwest
- The Man Who Wasn't There

3. 标量(字符串、数字、布尔值)

Section titled “3. 标量(字符串、数字、布尔值)”

标量是简单的值,如字符串、数字或布尔值。示例:Casablanca(字符串)、33(数字)、true(布尔值)。

YAML 允许嵌套这些结构。您也可以使用内联(或“流式”)格式以实现紧凑,它们看起来类似于 JSON。

# 用于购物清单的内联(流式)序列
shopping_list: [milk, groceries, eggs, juice, fruits]
# 用于简单对象的内联(流式)映射
point: {x: 10, y: 20}
# 组合块式和流式风格:一个映射序列
users:
- {name: John Smith, age: 33} # 块式序列中的流式映射
- name: Mary Smith # 块式序列中的块式映射
age: 27
# 更复杂的结构
people:
men: [John Smith, Bill Jones] # 值为流式序列的映射
women:
- Mary Smith # 值为块式序列的映射
- Susan Williams
  • 注释:以 # 开头并延伸到行尾。它们被解析器忽略。
  • 缩进:空白缩进(空格,而不是制表符)定义结构。
  • 序列(列表):在块式风格中,项目由前导的破折号和空格(- )表示;在流式风格中,项目用方括号([])括起来并用逗号分隔。
  • 映射(字典):在块式风格中表示为由冒号和空格(: )分隔的键值对;在流式风格中,用花括号({})括起来并用逗号分隔。
  • 标量:普通值(字符串、数字、布尔值)。可以是无引号的、单引号的('...')或双引号的("...")。
  • 多文档:单个 YAML 流中的文档可以使用三个连字符(---)分隔。可选的三个点(...)可以标记文档的结束。
  • 锚点和别名:用于重用数据。锚点(&anchor_name)定义一块数据,别名(*anchor_name)引用它。
  • 标签:使用 ! 或 !! 显式指定数据类型(例如,!!str、!!int)。通常是隐式推断的。

YAML 的可读性使其在以下方面流行:

  • 配置文件:Docker Compose、Kubernetes manifests、CI/CD 流水线(GitHub Actions、GitLab CI)、应用程序设置。
  • 数据序列化:存储和传输结构化数据。
  • 进程间消息传递:在不同的软件组件之间交换数据。

初学者最常见的错误来源是缩进不正确。每个级别始终使用一致数量的空格(例如,2 个空格)。大多数现代文本编辑器都可以配置为自动将制表符转换为空格,并帮助可视化缩进级别,从而更容易编写有效的 YAML。