2、YAML基础语法:缩进规则、键值对、注释、多行字符串、锚点与别名

说实话,YAML 这东西我第一次接触时,觉得它不就是个配置文件嘛,能有多复杂?结果真上手写 CI/CD 流水线时,被缩进坑了好几次。嗯,今天咱们就把 YAML 的基础语法掰开揉碎讲清楚。

2.1 缩进规则:YAML 的命根子

YAML 用缩进来表示层级关系。这一点跟 Python 很像,但比 Python 更严格。我个人习惯用两个空格缩进,这也是业界主流做法。

⚠️ 注意:YAML 不允许使用 Tab 键缩进!只能用空格。我曾经在项目中排查过一个 Bug,整整花了半小时,最后发现是编辑器把 Tab 和空格混用了。

来看个例子:

# 正确的缩进
server:
  host: 127.0.0.1
  port: 8080
  database:
    name: mydb
    user: admin

# 错误的缩进(混用了 Tab)
server:
  host: 127.0.0.1
    port: 8080  # 这行会报错

缩进层级必须一致。同一层级的键,缩进空格数必须相同。你想想看,如果有的缩进 2 格,有的缩进 3 格,解析器根本不知道谁是谁的爹。

2.2 键值对:最基础的数据单元

YAML 的核心就是键值对。格式很简单:key: value。注意冒号后面要跟一个空格。

name: 张三
age: 28
is_student: false
score: 95.5

值可以是多种类型:字符串、数字、布尔值、null 等。字符串默认不用加引号,但如果包含特殊字符(比如冒号、#),最好用引号包起来。

💡 小技巧:我建议字符串统一加单引号,尤其是当值里可能包含 YAML 保留字符时。比如 time: '10:30',不加引号会被解析成时间格式。

2.3 注释:给未来的自己留个话

YAML 的注释用 # 开头。可以单独一行,也可以跟在代码后面。

# 这是服务器配置
server:
  host: 127.0.0.1  # 本地地址
  port: 8080       # 端口号

说实话,注释这东西,写的时候觉得多余,三个月后回来看代码,恨不得抽自己两巴掌——当初怎么不多写两句?

2.4 多行字符串:处理长文本的三种姿势

YAML 支持三种多行字符串写法,每种都有不同的行为。我刚开始用的时候经常搞混,后来总结了个口诀:

写法 符号 行为 适用场景
保留换行 | 保留所有换行符 Shell 脚本、多行命令
折叠换行 > 将换行替换为空格 长文本段落、描述信息
普通多行 无符号 每行独立,需手动拼接 简单多行文本

看代码更直观:

# 保留换行(|)
script: |
  echo "Hello"
  echo "World"
  # 输出:
  # Hello
  # World

# 折叠换行(>)
description: >
  这是一段很长的描述文本,
  会被折叠成一行。
  # 输出:这是一段很长的描述文本,会被折叠成一行。

# 普通多行
message:
  第一行
  第二行
  # 输出:["第一行", "第二行"]
🔑 重点:我在写 CI/CD 流水线时,经常用 | 来写多行 Shell 命令。用 > 写 Docker Compose 里的服务描述。选对符号,能省不少事。

2.5 锚点与别名:DRY 原则的利器

YAML 支持锚点(&)和别名(*),用来复用配置。说白了就是定义一次,到处引用。

我曾经维护过一个有 2000 多行的 Kubernetes 配置,里面大量重复的 Pod 模板。用锚点重构后,直接砍掉了一半代码量。

# 定义锚点
defaults: &defaults
  image: nginx:latest
  ports:
    - 80
    - 443

# 使用别名
web:
  <<: *defaults
  replicas: 3

api:
  <<: *defaults
  image: my-api:1.0
  replicas: 2

这里 &defaults 定义了一个锚点,*defaults 引用它。<<: 是合并操作符,把锚点的内容合并到当前节点。

⚠️ 注意:锚点不能循环引用。比如 A 引用 B,B 又引用 A,解析器会直接报错。我在项目中见过有人这么干,结果排查了半天。

2.6 知识体系总览

下面这张图帮你理清 YAML 基础语法的核心脉络:

YAML 基础语法知识体系 YAML 基础语法 缩进规则 只能用空格,不用 Tab 推荐 2 空格缩进 键值对 key: value 格式 冒号后必须加空格 注释 # 开头 可单独一行或行尾 多行字符串 | 保留换行 > 折叠换行 锚点与别名 & 定义锚点 * 引用别名 核心原则:缩进决定层级,空格决定成败 锚点别名复用配置,多行字符串按需选择

2.7 实战小贴士

最后分享几个我在项目中积累的经验:

  • 用 YAML Lint 工具检查语法——我每次提交配置前都会跑一遍,能避免 90% 的缩进错误。
  • 复杂配置用锚点重构——如果发现 YAML 文件里有大量重复内容,别犹豫,用锚点抽出来。
  • 多行字符串优先用 |——除非你明确需要折叠行为,否则 | 最直观,不容易出错。
  • 注释要写「为什么」而不是「是什么」——代码本身已经说明了「是什么」,注释应该解释「为什么这么写」。
💡 我的习惯:每个 YAML 文件开头都加一段注释,说明这个文件的用途、维护人、最后修改日期。别小看这个习惯,半年后你回来改配置时,会感谢当初的自己。

好了,YAML 的基础语法就讲到这里。这些规则看着简单,但真正用好需要多练。下一节咱们会深入 YAML 的高级特性,包括数据类型、序列化、以及如何在 CI/CD 中实战应用。

可可精品资料库