YAML基础:语法规则与实战技巧
说实话,我第一次接触YAML时,觉得它就是个「长得好看点的配置文件」。但真正用起来才发现——这玩意儿坑也不少。尤其是做Composition和System描述文件时,一个缩进错误就能让你排查半天。
今天我就把YAML的核心知识点掰开揉碎了讲。都是我在项目中踩过的坑、总结的经验。
一、YAML语法规则
YAML的设计哲学很简单:人类可读。它不像XML那样啰嗦,也不像JSON那样满眼括号。
几个基本规则,我建议你记牢:
- 大小写敏感:
true和True不一样 - 缩进用空格:绝对不能用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里最「坑」的部分。为什么?因为换行符的处理方式有好几种。
我总结一下常用的三种:
| 语法 | 含义 | 示例 |
|---|---|---|
| |
保留换行(块字面量) | |
> |
折叠换行(块折叠) | |
"" |
双引号字符串 | |
区别在哪?
|:你写几行,输出就是几行。适合配置脚本、多行描述>:会把换行变成空格,最后加一个换行。适合长段落"":支持转义字符,比如\n、\t
# 实际输出对比
description: |
这是第一行
这是第二行
# 输出: "这是第一行\n这是第二行\n"
summary: >
这是第一行
这是第二行
# 输出: "这是第一行 这是第二行\n"
command: "echo hello\nworld"
# 输出: "echo hello\nworld"(\n被转义为换行)
避坑指南:我曾经在写Docker Compose文件时,用>写了一个长命令,结果换行被折叠成了空格,命令执行失败。后来改用|才解决。所以,写命令或脚本时,优先用|。
六、知识体系总览
下面这张图,是我梳理的YAML核心知识结构。你可以把它当作「速查地图」。
嗯,这张图把YAML的五个核心知识点串起来了。你写Composition文件时,遇到任何问题都可以回来对照着看。
七、写在最后
YAML看起来简单,但真正用好需要实践。我建议你:
- 先拿一个小项目练手,把今天讲的语法都试一遍
- 遇到解析错误时,优先检查缩进
- 多写锚点,少复制粘贴
- 字符串处理时,想清楚你要保留换行还是折叠
说白了,YAML就是个工具。工具好不好用,取决于你用得熟不熟。多写几次,这些规则就变成肌肉记忆了。