正在加载,请稍候…

将 TOML 转换为 YAML:表格、缩进与 CI 配置

正确地将 TOML 转换为 YAML——表格和数组如何变成嵌套的 YAML、缩进规则、引号陷阱,以及为什么 CI 管道通常需要 YAML。

将 TOML 转换为 YAML:表格、缩进与 CI 配置

为什么从 TOML 转到 YAML?

TOML 是一种非常适合手动编辑的配置格式,但许多生态系统——Kubernetes、GitHub Actions、GitLab CI、Ansible、Docker Compose——都使用 YAML。当某个工具或管道只接受 YAML 时,你需要在不改变配置含义的前提下翻译你的 TOML 配置。这两种格式描述的是相同的基础数据模型(映射、列表和标量的树),因此从 TOML 到 YAML 的转换是无损的。

将 TOML 转换为 YAML:表格、缩进与 CI 配置 插图

表格如何变成嵌套

TOML 的表头变成了 缩进的 YAML 键。TOML 使用扁平的 [section] 标记,而 YAML 使用缩进来表示相同的层次结构:

title = "My App"

[database]
host = "localhost"
port = 5432
title: My App
database:
  host: localhost
  port: 5432

[database] 表头变成了 database: 键,其子项缩进两个空格。带点的 TOML 表头如 [a.b.c] 会变成三层 YAML 缩进。

将 TOML 转换为 YAML:表格、缩进与 CI 配置 插图

表格数组变成映射列表

TOML 的双括号表格数组映射为 YAML 的 映射序列

[[steps]]
name = "build"
run = "make"

[[steps]]
name = "test"
run = "make test"
steps:
  - name: build
    run: make
  - name: test
    run: make test

每个 [[steps]] 块变成一个 - 列表项。这正是 CI 系统期望的任务步骤的形状,因此 TOML→YAML 转换在管道工作中频繁出现。

将 TOML 转换为 YAML:表格、缩进与 CI 配置 插图

引号和缩进陷阱

YAML 对空白敏感,并且有一长串值如果不加引号会改变含义。转换器会处理这些,但了解为什么输出会对某些字符串加引号会有所帮助:

  • 伪装成布尔值的字符串——yesnoonofftruefalse 在 YAML 1.1 中被解释为布尔值。字符串 "yes" 必须加引号才能保持为字符串。
  • 数字和版本号——1.10 会被解析为数字 1.1;像 "1.10" 这样的版本字符串需要引号。
  • 前导零和冒号——像 08:000755 这样的值可能被误读;加引号可以保持字面值。
  • 缩进必须是空格,绝不能是制表符。生成的文件使用一致的两个空格缩进。

验证结果

由于 YAML 对格式敏感,在将输出提交到管道之前要验证它。快速往返检查——解析 YAML 并将结果数据结构与原始 TOML 进行比较——可以捕获任何引号意外。大多数 CI 平台也提供配置检查器;转换后运行一次。

常见问题

TOML 到 YAML 的转换是无损的吗? 是的。两种格式都表示相同的映射/列表/标量模型,并且 TOML 中可表达的一切都有 YAML 等价物,因此朝这个方向转换不会丢失数据。

为什么转换器会对某些字符串加引号而对其他字符串不加? 为了保护那些 YAML 会重新解释的值——yes/no 作为布尔值,1.10 作为数字,像 08:00 这样的时间。加引号强制它们保持为字符串。

我可以直接将 TOML 转换为 GitHub Actions 或 Kubernetes 文件吗? 数据结构转换得很干净,但每个平台都期望特定的顶级键。先转换,然后调整键名以匹配目标模式。

将你的 TOML 粘贴到上面的转换器中,即可获得干净、正确缩进的 YAML,准备好用于 CI 管道和 Kubernetes 清单。