YAML基础:语法规则与实战技巧

说实话,我第一次接触YAML时,觉得它就是个「长得好看点的配置文件」。但真正用起来才发现——这玩意儿坑也不少。尤其是做Composition和System描述文件时,一个缩进错误就能让你排查半天。

今天我就把YAML的核心知识点掰开揉碎了讲。都是我在项目中踩过的坑、总结的经验。

一、YAML语法规则

YAML的设计哲学很简单:人类可读。它不像XML那样啰嗦,也不像JSON那样满眼括号。

几个基本规则,我建议你记牢:

  • 大小写敏感trueTrue不一样
  • 缩进用空格:绝对不能用Tab。我见过有人因为这个排查了半小时
  • 注释用#:从#开始到行尾都是注释
  • 文件以---开头:表示文档开始,虽然不是强制,但我建议加上

核心要点:YAML的数据结构只有三种——标量(scalar)、列表(list)、字典(mapping)。所有复杂结构都是这三者的组合。

# 这是一个标准的YAML文件
---
# 标量:字符串、数字、布尔值
name: "Composition示例"
version: 2.0
enabled: true

# 列表
services:
  - web
  - db
  - cache

# 字典
config:
  port: 8080
  host: "localhost"

二、缩进与层级

YAML的缩进就是它的「灵魂」。我刚开始带团队时,新人最常犯的错误就是缩进不一致。

规则很简单:同一层级的元素缩进必须相同。子元素比父元素多缩进2个空格(我个人习惯用2个,也有人用4个,关键是统一)。

# 正确的缩进
system:
  name: "my-system"
  components:
    - type: "web"
      port: 80
    - type: "db"
      port: 5432

# 错误的缩进——你会得到解析错误
system:
  name: "my-system"
  components:
    - type: "web"
    port: 80  # 缩进不对!

注意:我曾经在项目中遇到一个诡异问题——YAML文件在本地能解析,到CI服务器就报错。查了半天,原来是本地编辑器把Tab自动转成了空格,而CI服务器上的编辑器没有。所以,永远不要用Tab

三、列表与字典

列表和字典是YAML的「左膀右臂」。说白了:

  • 列表:用短横线 - 开头,表示一组有序的值
  • 字典:用 键: 值 的形式,表示键值对

它们可以互相嵌套,这也是Composition描述文件的核心结构。

# 纯列表
fruits:
  - apple
  - banana
  - cherry

# 纯字典
person:
  name: "张三"
  age: 30
  city: "北京"

# 列表嵌套字典(最常用)
services:
  - name: "nginx"
    image: "nginx:latest"
    ports:
      - 80
      - 443
  - name: "redis"
    image: "redis:7"
    ports:
      - 6379

你想想看,Composition文件里是不是经常这样写?每个服务就是一个字典,多个服务组成列表。嗯,就是这么回事。

四、锚点与别名

这个功能我特别喜欢。YAML的锚点(anchor)和别名(alias)可以让你复用配置,避免重复。

语法很简单:

  • 定义锚点:用 &锚点名
  • 引用锚点:用 *锚点名
  • 覆盖部分属性:用 <<: *锚点名
# 定义基础配置
base-config: &default
  image: "nginx:latest"
  restart: "always"
  networks:
    - "frontend"

# 直接引用
web-service:
  <<: *default
  ports:
    - "80:80"

# 覆盖部分属性
api-service:
  <<: *default
  image: "nginx:alpine"  # 覆盖image
  ports:
    - "8080:80"

实战技巧:我在做微服务Composition文件时,经常把公共配置(如日志、监控、网络)定义成锚点。这样改一处,所有服务都生效。省心!

五、多行字符串

字符串是YAML里最「坑」的部分。为什么?因为换行符的处理方式有好几种。

我总结一下常用的三种:

语法 含义 示例
| 保留换行(块字面量)
text: |
  第一行
  第二行
  第三行
> 折叠换行(块折叠)
text: >
  第一行
  第二行
  第三行
"" 双引号字符串
text: "第一行\n第二行"

区别在哪?

  • |:你写几行,输出就是几行。适合配置脚本、多行描述
  • >:会把换行变成空格,最后加一个换行。适合长段落
  • "":支持转义字符,比如 \n\t
# 实际输出对比
description: |
  这是第一行
  这是第二行
# 输出: "这是第一行\n这是第二行\n"

summary: >
  这是第一行
  这是第二行
# 输出: "这是第一行 这是第二行\n"

command: "echo hello\nworld"
# 输出: "echo hello\nworld"(\n被转义为换行)

避坑指南:我曾经在写Docker Compose文件时,用>写了一个长命令,结果换行被折叠成了空格,命令执行失败。后来改用|才解决。所以,写命令或脚本时,优先用|

六、知识体系总览

下面这张图,是我梳理的YAML核心知识结构。你可以把它当作「速查地图」。

YAML 核心知识 语法规则 • 大小写敏感 • 缩进用空格 • 注释用 # • 文件以 --- 开头 缩进与层级 • 同级缩进一致 • 子级多2空格 • 禁止使用Tab • 层级决定结构 列表与字典 • 列表:- 开头 • 字典:键: 值 • 支持互相嵌套 • 核心数据结构 锚点与别名 • 定义:&锚点名 • 引用:*锚点名 • 覆盖:<<: *锚点名 • 避免重复配置 多行字符串 • | 保留换行 • > 折叠换行 • "" 支持转义 • 按场景选择 实战应用 • Composition文件 • System描述文件 • Docker Compose • Kubernetes配置 掌握这5个核心,YAML基本就通了

嗯,这张图把YAML的五个核心知识点串起来了。你写Composition文件时,遇到任何问题都可以回来对照着看。

七、写在最后

YAML看起来简单,但真正用好需要实践。我建议你:

  1. 先拿一个小项目练手,把今天讲的语法都试一遍
  2. 遇到解析错误时,优先检查缩进
  3. 多写锚点,少复制粘贴
  4. 字符串处理时,想清楚你要保留换行还是折叠

说白了,YAML就是个工具。工具好不好用,取决于你用得熟不熟。多写几次,这些规则就变成肌肉记忆了。

专注资料整理