Desk | notes drafts

配置文件格式简史

INI 最早出现于 80 年代,嵌套不能超过一层,没有什么统一的规范,几乎每个解析器都有自己的方言,从 90 年代开始,人们开始在 Java 项目中使用 XML,它最大的问题是嵌套的层级太多了,很容易让文件变得非常冗长,之后 JSON 被发明出来,很简洁,不能用注释,不能写多行字符串,虽然对于数据交换来说很好,但是并不利于人们的维护;

YAML 和 TOML 的发明都是为了解决上述的问题,当前主流的论调是 TOML 比 YAML 更好,因为 YAML 1.1 出过比较败名声的挪威事件:挪威的国家码 no 会被解析成布尔值 false, 以及 n 和 y 会被解析成 false 和 true,这些问题在 YAML 1.2 中其实都已经被解决了;

TOML 和 INI 非常相似,它规范了现实类型,和嵌套表,如果对于一两层深度的配置文件,用起来往往没有什么问题,但是当配置的层级深度比较高的时候,就没有依靠缩进表示层级的 YAML 直观了,例子如下:

services:
  web:
    image: nginx:latest
    environment:
      DB_HOST: postgres
      DB_PORT: 5432
    resources:
      limits:
        memory: 512
        cpu: "0.5"

在 TOML 中,需要在标题中重复完整的配置路径

[services.web]
image = "nginx:latest"

[services.web.environment]
DB_HOST = "postgres"
DB_PORT = 5432

[services.web.resources.limits]
memory = "512M"
cpu = "0.5"

对于 TOML 配置,读者必须在自己的脑海中构建整个嵌套结构,对于层级较多的配置,非常不易读,而且标题中重复的字符会非常的多。

总的来看,相对简单的配置文件,用 TOML 就好,层级深、复杂的配置,就用 YAML。

原文:In Defense of YAML.