YAML Anchor(锚点)详解

352 阅读2分钟

🍃前言

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  # 覆盖默认值

🐼最后补充一些扩展知识

值得注意的是:

  1. 锚点必须在同一文档中使用
  2. 引用必须在锚点定义之后,定义了才能用
  3. 合并是浅合并(不会递归合并嵌套对象)

下面重点说下【浅合并】

有如下的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     # 只有顶层键被合并

以上就是本篇文章的全部内容!

下次见!!

🍃