TOML 解析器
TOML(Tom's Obvious Minimal Language)是一种极简配置文件格式,设计目标是易于读写。它是 Rust(Cargo.toml)、Python 打包(pyproject.toml)以及许多其他现代开发工具的标准配置格式。
规范
常见用例
- 解析 Cargo.toml 获取 Rust 项目依赖和元数据
- 读取 pyproject.toml 获取 Python 构建配置(PEP 518/621)
- 处理 Hugo、Zola 或其他静态站点生成器配置
- 编辑 Deno 配置文件(deno.toml)
- 在部署前验证配置
功能
- 完整支持 TOML v1.0.0 规范
- 解析表、表数组和嵌套结构
- 处理内联表和数组
- 支持日期/时间值
- 转换为 JSON、YAML 或 XML
- 语法验证并提供错误消息
示例
Rust Cargo.toml
试试看 →一个定义包元数据和依赖项的 Cargo 清单。
[package]
name = "my-project"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1", features = ["full"] }Python pyproject.toml
试试看 →包含构建系统和元数据的 Python 项目配置。
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "my-package"
version = "1.0.0"
dependencies = ["requests>=2.28"]提示
- TOML 使用 = 表示键值对,不同于 YAML 的冒号。
- 字符串必须用引号括起来。使用 """ 表示多行字符串。
- 表([table])用于创建嵌套结构。
- 表数组使用 [[array]] 语法。
理解 TOML 解析器
TOML(Tom's Obvious Minimal Language)是一种旨在无歧义且易于阅读的配置文件格式。由 Tom Preston-Werner(GitHub 联合创始人)创建,TOML 可以干净地映射到哈希表,有意比 YAML 更简单,同时比 INI 文件更具表现力。1.0.0 版本于 2021 年定稿。
TOML 的设计以清晰为中心。键和值使用简单的 "key = value" 语法。表(节)用 [方括号] 表示,创建嵌套结构而无需依赖缩进。表数组使用 [[双方括号]] 来定义重复的节。TOML 原生支持字符串、整数、浮点数、布尔值、日期、时间和日期时间作为一等类型,消除了 JSON 和 YAML 中常见的解析歧义。
Rust 生态系统很早就采用了 TOML,以 Cargo.toml 作为包清单格式。Python 紧随其后推出 pyproject.toml(PEP 518 和 PEP 621),使其成为 setup.py 和 setup.cfg 的现代替代方案。TOML 还出现在 Go 工具、Deno(deno.toml)、Hugo 以及许多其他重视显式、可读配置的开发者工具中。
TOML 用灵活性换取可预测性。与 YAML 不同,每种数据结构只有一种表示方式。没有锚点、没有别名、没有隐式类型转换的意外,也没有有意义的空白字符。代价是深度嵌套的结构会变得冗长,因为每一层都需要自己的表头。
TOML 非常适合人们经常编辑的扁平或中等嵌套的配置文件。其无歧义的语法避免了 YAML 的布尔值强制转换和缩进错误等陷阱,同时比 JSON 更适合配置目的的阅读。TOML 是项目清单(Cargo.toml、pyproject.toml)和工具配置的自然选择。YAML 仍然更适合深度嵌套的结构(如 Kubernetes 清单),而 JSON 是系统间数据交换的标准。
[[双方括号]] 语法创建表数组,每次出现该头部时都会向数组添加一个新元素。例如,[[products]] 出现三次会创建一个包含三个产品对象的数组,每个对象都有按顺序收集的键值对。TOML 还支持使用井号(#)的单行注释,可以出现在独立行上或值之后。没有多行注释语法,但单行注释仍然是相对于完全不支持注释的 JSON 的一个重大优势。
表和内联表服务于不同目的。表使用 [header] 语法并跨越多行,使其在包含多个键的节中具有良好的可读性。内联表在单行中使用花括号(key = { a = 1, b = 2 }),并且必须完全在该行定义——定义后无法扩展。经验法则是,当一个节有两三个以上的键时,使用标准表以提高可读性。