一分钟了解YAML,使用场景,和它的优缺点
YAML:全称“YAML Ain’t Markup Language”,递归缩写意为“YAML不是标记语言”。YAML由Clark Evans、Ingy döt Net和Oren Ben-Kiki于2001年共同提出,最初命名为“Yet Another Markup Language”(另一种标记语言),后来强调其数据描述属性而非文档标记功能。
什么是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`开源项目作者💻📌关注我,每天花一分钟学一个编程知识📚
更多推荐



所有评论(0)