alltools.one
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"
]

关键差异

特性YAMLTOML
结构基于缩进区段头
字符串引号通常可选始终必需
类型推断激进(有风险)显式
注释#(单行)#(单行)
多行字符串|>三引号块
日期/时间支持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)领域正在增长,因为在这些场景中类型安全比深层嵌套更重要。这两种格式很可能会共存,各自主导自己的生态系统。

相关资源

Published on 2025-06-07
YAML vs TOML: Which Configuration Format Should You Choose? | alltools.one