什么是YAML?

YAML:全称“YAML Ain’t Markup Language”,递归缩写意为“YAML不是标记语言”。YAML由Clark Evans、Ingy döt Net和Oren Ben-Kiki于2001年共同提出,最初命名为“Yet Another Markup Language”(另一种标记语言),后来强调其数据描述属性而非文档标记功能。

2004年发布YAML 1.0标准,2010年推出1.2版本,并成为JSON的超集(兼容JSON语法并扩展功能)。YAML的设计目标是为人类提供更友好的数据序列化格式,尤其在配置文件和数据交换场景中替代XML和JSON的复杂性。

YAML格式长啥样?

以下是一个包含多种数据类型和结构的YAML格式示例,涵盖配置文件的各种常见场景,基本能充分展示YAML的核心特性:


# 应用配置示例
application:
  name: "MyApp"
  version: 1.2.3
  environment: &env production  # 定义锚点
  description: |
    这是一个多行字符串示例,
    保留换行格式,适合描述性文本。
  features:
    - auto_scaling: true
    - monitoring: enabled
    - backup_schedule: "0 2 * * *"  # 每天凌晨2点执行

database:
  <<: *env  # 引用锚点,继承production环境配置
  type: PostgreSQL
  connection:
    host: db.example.com
    port: 5432
    username: admin
    password: !secret db_password  # 密码通过外部安全方式注入
  pool_size: !!int 10  # 类型强制转换为整数

servers:
  - name: web_server
    ip: 192.168.1.10
    roles: [web, api]  # 列表简写形式
    os: Ubuntu 22.04 LTS
  - name: db_server
    ip: 192.168.1.20
    roles:
      - database
      - cache
    os: CentOS 7

logging:
  level: !!str debug  # 强制字符串类型
  file: /var/log/myapp.log
  rotation: 
    size: 100MB
    keep: 7 days

# 多文档分隔符示例
---
# 测试环境配置
test_env:
  name: "UnitTest"
  env: test
  features:
    - mock_api: true
    - debug_mode: true

YAML的格式特点

1 层级结构:

通过空格缩进(禁止制表符)表示层级,缩进长度灵活但需要对齐,相同层级缩进必须保持一致。(如下示例)

2 数据结构:

支持标量(字符串、数字、布尔值、日期、空值等)、列表(以`-`开头,如`- name: "MyApp"`)、字典(键值对`key: value`,如`size: 100MB`)及嵌套组合。

3 语法特性:

  • 注释以`#`开头,支持单行和多行注释。(如`# 强制字符串类型(注释文本内容)`)
  • 多行字符串使用`|`(保留换行)或`>`(折叠换行)表示。
  • 锚点`</span>`与别名`*`实现配置复用,如`&defaults`定义锚点,`<<: *defaults`引用配置。
  • 多文档分隔符`---`支持同一文件包含多个独立文档。

4 支持数据类型:

YAML格式兼容JSON基础数据类型,并扩展了部分复杂类型,如时间戳`created_at:2023-04-01T12:00:00Z`、集合等。YAML也支持类型强制(如`!!str`、`!!int`)。

YAML的使用场景

  • 配置文件:应用配置(如Webpack、Vite)、容器编排(Docker Compose、Kubernetes YAML)、自动化工具(Ansible Playbooks、Terraform)。
  • CI/CD流水线(工作流):GitHub Actions、GitLab CI、Travis CI的流程定义。
  • 静态内容生成:Hexo、Hugo的内容文件,Markdown文档的元数据。
  • 数据交换:API通信(部分RESTful API支持YAML)、日志/缓存数据序列化、测试框架(Jest、Cypress)配置。
  • 基础设施即代码:云资源定义(AWS CloudFormation、Azure ARM模板)、配置管理。

YAML格式的优缺点分析

1 YAML有哪些优点:

  • 高可读性:接近自然语言的缩进和简洁语法,减少冗余符号(如JSON的引号、括号)。
  • 结构灵活:支持复杂嵌套数据结构,锚点/别名减少重复定义。
  • 跨语言兼容:语言无关,广泛库支持(Python的PyYAML、JavaScript的js-yaml、Java的SnakeYAML)。
  • 扩展性强:支持自定义标签、类型强制及多文档处理。
  • 注释支持:便于文档化配置项,提升可维护性。

2 YAML的相对缺点:

  • 缩进敏感:不规范的空格/制表符混用或缩进不一致易导致解析错误。
  • 解析复杂度:相比INI/JSON,YAML解析器需处理缩进、锚点、多文档等特性,大文件解析性能较低。
  • 版本兼容性:YAML 1.1与1.2在部分特性(如集合类型)存在差异,需注意兼容问题。
  • 错误信息模糊:解析错误时可能缺乏明确提示,调试难度较高。
  • 过度设计风险:锚点/别名或复杂嵌套可能增加理解成本,需平衡简洁性与可维护性。

--End--

👨我是`WordBN字远笔记`软件、`C++应用服务器MYCP`开源项目作者💻

📌关注我,每天花一分钟学一个编程知识📚

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐