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 领域非常强大!🚀