YAML 语言标记语言高级用法
YAML 作为一种灵活且易读的标记语言,在高级用法上提供了许多强大的特性,适用于 配置管理、数据序列化 以及 DevOps 领域(如 Kubernetes、Docker Compose 等)。以下是 YAML 的一些重要高级用法及其详细解释:
1. 多行字符串表示
YAML 提供了 两种 主要的多行字符串表示方式:
(1) 折叠块 (>)
折叠块会将换行符转换为空格(但会保留显式的空行)。
message: >
This is a long
message that spans
multiple lines.
等价于:
message: "This is a long message that spans multiple lines."
>- vs > 的区别:
(2) 字面量块 (|)
字面量块会保留换行符:
message: |
This is a long
message that spans
multiple lines.
等价于:
message: "This is a long\nmessage that spans\nmultiple lines.\n"
|- vs | 的区别:
2. 锚点 (&) 和引用 (*)
YAML 允许使用 锚点 (&) 定义变量,并用 引用 (*) 复用它们,减少重复代码。
default: &default_config
host: localhost
port: 8080
server1:
<<: *default_config
port: 9090
等价于:
default:
host: localhost
port: 8080
server1:
host: localhost
port: 9090
解释:
&default_config 创建一个锚点 default_config
*default_config 在 server1 里引用 default_config
<<: 语法用于合并 default_config 进 server1
嵌套引用
base: &base
name: CommonConfig
details:
key: value
config1:
<<: *base
details:
key: new_value # 会覆盖 base.details.key
🔹 YAML 允许部分覆盖,config1.details.key 覆盖了 base.details.key。
3. 合并多个 YAML 结构
(1) 使用 <<: 进行合并
default: &default
a: 1
b: 2
custom:
<<: *default
c: 3
等价于:
custom:
a: 1
b: 2
c: 3
🔹 <<: 让 custom 继承 default 的值,并可以新增 c。
4. 字典 (对象) 和 列表
(1) 字典
person:
name: Alice
age: 30
等价于:
person: { name: Alice, age: 30 }
(2) 列表
items:
- Apple
- Banana
- Orange
等价于:
items: [Apple, Banana, Orange]
5. 环境变量和动态值
YAML 本身不支持环境变量,但很多解析器(如 docker-compose.yml、Kubernetes)允许使用 ${} 读取环境变量:
database:
user: ${DB_USER}
password: ${DB_PASSWORD}
🔹 运行时 解析器会将 ${DB_USER} 替换为环境变量值。
6. 引用 JSON
YAML 兼容 JSON,可以直接嵌入 JSON 结构:
json_style: { "key1": "value1", "key2": "value2" }
7. 使用 ? 作为键
YAML 允许使用 ? 定义 复杂键名(如对象、列表):
? [first, second]
: "value"
等价于:
["first", "second"]: "value"
8. 布尔值、Null、数字格式
| YAML 值 | 解析为 |
true / True / TRUE | true |
false / False / FALSE | false |
null / Null / NULL / ~ | null |
1_000 | 1000 |
.inf / -.inf | Infinity / -Infinity |
9. 自定义标签 (!!)
YAML 允许使用 !! 指定数据类型:
integer: !!int "42"
float: !!float "3.14"
boolean: !!bool "yes"
🔹 !!int 强制 42 为整数,!!float 强制 3.14 为浮点数。
10. 日期时间格式
YAML 支持 ISO 8601 格式的日期:
date: 2024-03-15
datetime: 2024-03-15T12:00:00Z
🔹 注意:解析器可能会自动转换为 DateTime 对象。
11. YAML 片段合并 (Include)
有些 YAML 解析器(如 yq、docker-compose.yml)允许 !include 加载外部 YAML 文件:
config: !include common.yaml
🔹 注意:YAML 本身不支持 !include,需特定解析器支持。
12. YAML 解析器指令 (%TAG 和 %YAML)
%YAML 1.2
%TAG ! tag:example.com,2025:
---
!person
name: John Doe
age: 30
🔹 作用:
%YAML 1.2 指定 YAML 版本
%TAG ! tag:example.com,2025: 设定 !person 为 example.com,2025:person
13. YAML 中的注释
YAML 使用 # 添加注释:
# 这是一个注释
key: value # 这是行尾注释
14. 在 YAML 中使用 Python 风格的 dict
某些 YAML 解析器(如 ruamel.yaml)支持 Python 风格的 dict:
default: !!map { host: localhost, port: 8080 }
等价于:
default:
host: localhost
port: 8080
总结
| 高级特性 | 作用 |
>- / | | 多行字符串(折叠/保持换行) |
& / * | 锚点和引用 |
<<: | 继承/合并 YAML 结构 |
? | 复杂键 |
!! | 指定数据类型 |
${VAR} | 读取环境变量 |
!include | 加载外部 YAML |
# | 注释 |
YAML 这些高级特性使其在 配置文件、数据存储 以及 DevOps 领域非常强大!🚀