2、YAML基础语法:缩进规则、键值对、注释、多行字符串、锚点与别名
说实话,YAML 这东西我第一次接触时,觉得它不就是个配置文件嘛,能有多复杂?结果真上手写 CI/CD 流水线时,被缩进坑了好几次。嗯,今天咱们就把 YAML 的基础语法掰开揉碎讲清楚。
2.1 缩进规则:YAML 的命根子
YAML 用缩进来表示层级关系。这一点跟 Python 很像,但比 Python 更严格。我个人习惯用两个空格缩进,这也是业界主流做法。
来看个例子:
# 正确的缩进
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 等。字符串默认不用加引号,但如果包含特殊字符(比如冒号、#),最好用引号包起来。
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:
第一行
第二行
# 输出:["第一行", "第二行"]
| 来写多行 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 引用它。<<: 是合并操作符,把锚点的内容合并到当前节点。
2.6 知识体系总览
下面这张图帮你理清 YAML 基础语法的核心脉络:
2.7 实战小贴士
最后分享几个我在项目中积累的经验:
- 用 YAML Lint 工具检查语法——我每次提交配置前都会跑一遍,能避免 90% 的缩进错误。
- 复杂配置用锚点重构——如果发现 YAML 文件里有大量重复内容,别犹豫,用锚点抽出来。
- 多行字符串优先用
|——除非你明确需要折叠行为,否则|最直观,不容易出错。 - 注释要写「为什么」而不是「是什么」——代码本身已经说明了「是什么」,注释应该解释「为什么这么写」。
好了,YAML 的基础语法就讲到这里。这些规则看着简单,但真正用好需要多练。下一节咱们会深入 YAML 的高级特性,包括数据类型、序列化、以及如何在 CI/CD 中实战应用。