Development•
2025-06-07
•6 min
•alltools.one Team
YAMLTOMLConfigurationDevOpsDevelopment
YAML vs TOML:应该选择哪种配置格式?
YAML 和 TOML 都是人类可读的配置格式,但它们采用了根本不同的方法。YAML 使用缩进来表示结构;TOML 使用 INI 风格的区段头和显式的键值语法。正确的选择取决于你的项目、团队和生态系统。
语法对比
两种格式的相同配置
YAML:
database:
host: localhost
port: 5432
name: myapp
ssl: true
pool:
min: 5
max: 20
server:
host: 0.0.0.0
port: 8080
workers: 4
cors:
origins:
- https://example.com
- https://api.example.com
TOML:
[database]
host = "localhost"
port = 5432
name = "myapp"
ssl = true
[database.pool]
min = 5
max = 20
[server]
host = "0.0.0.0"
port = 8080
workers = 4
[server.cors]
origins = [
"https://example.com",
"https://api.example.com"
]
关键差异
| 特性 | YAML | TOML |
|---|---|---|
| 结构 | 基于缩进 | 区段头 |
| 字符串引号 | 通常可选 | 始终必需 |
| 类型推断 | 激进(有风险) | 显式 |
| 注释 | #(单行) | #(单行) |
| 多行字符串 | | 和 > 块 | 三引号块 |
| 日期/时间支持 | ISO 8601 字符串 | 原生 datetime 类型 |
| 锚点/别名 | 支持 | 不支持 |
| 嵌套深度 | 无限制(实际使用) | 无限制(深层嵌套较冗长) |
| 表数组 | 映射序列 | [[section]] 语法 |
| 规范 | 大型、复杂 | 小型、简洁 |
类型安全
YAML 的类型推断问题
YAML 激进地推断类型,导致微妙的 bug:
version: 1.0 # 浮点数,不是字符串 "1.0"
country: NO # 布尔值 false,不是字符串 "NO"
port: '080' # 八进制数 64,不是字符串 "080"
on: true # 布尔值,不是字符串 "on"
TOML 的显式类型
TOML 要求显式语法,防止类型混淆:
version = "1.0" # 字符串(引号必需)
country = "NO" # 字符串(引号必需)
port = "080" # 字符串(引号必需)
on = true # 布尔值(无歧义)
TOML 对日期和时间有原生类型:
created = 2024-01-15 # DateTime(原生类型)
date-only = 2024-01-15 # 日期
time-only = 10-30-00 # 时间
生态支持
YAML 占据主导
- Docker Compose
- Kubernetes
- GitHub Actions
- Ansible
- CI/CD 流水线(CircleCI、GitLab CI、Travis CI)
- 云服务(AWS CloudFormation、Azure)
- 大多数 DevOps 工具
TOML 在增长
- Rust(Cargo.toml)
- Python(pyproject.toml,PEP 518)
- Go(go.mod 使用自定义格式,但配置使用 TOML)
- Hugo(站点配置)
- Netlify
- pip(pyproject.toml)
JSON 配置(作为对比)
- Node.js(package.json、tsconfig.json)
- VS Code 设置
- ESLint、Prettier
- 大多数 JavaScript 工具
何时使用 YAML
- DevOps 和基础设施:Kubernetes、Docker、CI/CD——生态系统要求使用
- 复杂的嵌套结构:YAML 更自然地处理深层嵌套
- 通过锚点复用:使用锚点和别名实现 DRY 配置
- 团队惯例:如果你的团队已经广泛使用 YAML
需要 YAML 帮助?我们的 YAML 格式化工具 和 YAML 验证器 是必备工具。
何时使用 TOML
- Python 项目:pyproject.toml 是标准
- Rust 项目:Cargo.toml 是标准
- 简单配置:扁平或浅层嵌套的设置
- 类型安全重要时:TOML 的显式引号防止类型混淆
- 新项目:如果不受生态系统约束,TOML 对配置文件更安全
何时两者都不用
- 机器生成的配置:使用 JSON(解析最快,格式最严格)
- 带模式的应用设置:使用 JSON 配合 JSON Schema 验证
- 数据交换:API 使用 JSON,表格数据使用 CSV
常见问题
可以在 YAML 和 TOML 之间转换吗?
可以,但有注意事项。YAML 的锚点、别名和复杂类型等特性在 TOML 中没有对应。简单的键值和嵌套配置可以顺利转换。yj(YAML 转 JSON)等工具配合 toml-cli 可以处理基本转换。
TOML 会取代 YAML 吗?
不太可能。YAML 在 DevOps 生态系统(Kubernetes、Docker、CI/CD)中根基太深。TOML 在应用配置(Rust、Python)领域正在增长,因为在这些场景中类型安全比深层嵌套更重要。这两种格式很可能会共存,各自主导自己的生态系统。
相关资源
- YAML 格式化工具 — 格式化 YAML 文件
- YAML vs JSON — 另一个格式对比
- YAML 语法教程 — 学习 YAML 基础知识