🍃前言
YAML Anchor(锚点)是YAML文件中用于避免重复定义相同内容的强大特性,它允许你标记一个节点并在文档的其他地方引用它。
🌟基本概念
锚点使用 & 定义,使用 * 引用:
# 定义锚点
person: &person_anchor
name: jjq
age: 24
# 引用锚点
employee: *person_anchor
解析后相当于:
person:
name: jjq
age: 24
employee:
name: jjq
age: 24
🩵合并键(Merge Key)
更强大的功能是使用 << 合并键来扩展锚点内容【注:合并键是基于锚点的】:
# 基础定义
base: &base
name: Default
value: 0
# 扩展基础定义
extended:
<<: *base
value: 42
description: 我是新增的字段
解析后相当于:
extended:
name: Default # 来自base
value: 42 # 覆盖了base的value
description: 我是新增的内容 # 新增字段
🤖复杂栗子🌰
# 定义数据库配置模板
db_config: &db_defaults # 注意,【&】表示定义锚点,后续引用用【*】
host: localhost
port: 5432
timeout: 5000
# 实际配置
development:
<<: *db_defaults # 注意,【<<】表示合并键
database: dev_db
production:
<<: *db_defaults
host: db.prod.example.com
database: prod_db
timeout: 10000 # 覆盖默认值
🐼最后补充一些扩展知识
值得注意的是:
- 锚点必须在同一文档中使用
- 引用必须在锚点定义之后,定义了才能用
- 合并是浅合并(不会递归合并嵌套对象)
下面重点说下【浅合并】
有如下的yaml文件的定义:
defaults: &defaults # 锚点
settings:
color: blue
size: medium
timeout: 30
custom:
<<: *defaults # 合并键
settings:
size: large
下面展示解析结果:
深合并是这样的【但YAML不会这样!!】:
custom:
settings:
color: blue # 保留默认值
size: large # 覆盖默认值
timeout: 30 # 保留默认值
但其实yaml会这样【浅合并!!!】:
custom:
settings: # 完全覆盖了defaults.settings
size: large # color丢失了!
timeout: 30 # 只有顶层键被合并
以上就是本篇文章的全部内容!
下次见!!
🍃