Why TOML?
昨天打开alacritty的时候提示我yaml config is deprecated, please migrate to toml。所以toml是什么?它比yaml或其他配置文件的优势在哪里?
What is TOML?
首先来看一下TOML的语法:
# This is a TOML document.
title = "ImpalaPay Co."
[owner]
name = "Impala Co."
establishment=""
[database]
comment = """
This is a multi-line comment.
"""
[servers]
# Indentation (tabs and/or spaces) is allowed but not required
[servers.alpha]
ip = "10.0.0.1"
dc = "eqdc10"
[servers.beta]
ip = "10.0.0.2"
dc = "eqdc10"
[clients]
data = [ ["gamma", "delta"], [1, 2] ]
[object]
key = "value"
[[object.array]]
[[object.array]]
boolean = true
[[object.array]]
integer = 1
[[object.array]]
alias = "aliases are like variables"
[[object.array]]
alias = "aliases are like variables"
# Line breaks are OK when inside arrays
hosts = [
"alpha",
"omega"
]
首先可以看到TOML支持注释,有键值对与[section name]
的形式,其次TOML无需缩进,层级结构极其清楚,三引号用来表达多行字符串更符合编程习惯。然而TOML也有这诸多缺点,如:
- NOT DRY(Don't Repeat Yourself):如上所见,如果字典嵌套多次,表名就要重复大量次数,这使得其字节大小与YAML、JSON相比大大增加。
- Obivous?:TOML的语法有时候并不是那么直观,对于从没用过TOML的人,[[object.array]]与[section name]的区别并不是那么明显(特别是嵌套的情况下)。
- Overcomplication:在TOML的github主页上,作者痛斥了YAML的复杂性,然而TOML似乎也没有那么简单,TOML的复杂性尤其体现在对时间/日期的处理上。人们已经发现,时间/日期相关的处理就是一个深不见底的大坑,因此最好的方式就是应该将其脱耦,交给专门的库来处理,就像JSON一样。
Why not YAML?
作为最通用的配置文件格式,YAML已经被广泛使用,正好与TOML做对比,在这里也简单说明一下YAML的主要被批评的地方:
- The Norway Problem:在YAML中,NO会被解析为false,这就导致了配置国家相关时一定要额外注意挪威的简写问题(YES也有相关问题,还有NULL会解析为空等)。
- Overcomplication too:TOML批评了YAML的复杂性,这在于JSON规范只有6个图标,而YAML规范却足足有十大章节,这大大增加了复杂工程中的学习成本。
- Non-string keys:YAML键值对中的key可以是非字符串的(如boolean),这就导致不同语言的解析器对于key的解析不一致(当然,首先要避免的就是用boolean作为key),这就导致了YAML的不可移植性。
- Others:在Web配置或者其他配置中,我们通常会过滤文件,如
*.yaml
,*.html
,!.git
,令人悲伤的是,*在YAML中是一个对别名的引用,因此会被判定为不合法,同样的,!在YAML被看作一个标签,标签功能提供了将YAML中的简单类型解释为主机语言中定义的复杂类型的功能,通常通过使用给定名称来调用构造函数,即会执行意料之外的代码。因此,引用unsafe的YAML文件可能会造成严重后果。更致命的是,Golang的YAML包在解析时如果没有实现对应的构造函数,会直接解析为空字符串,这就可能产生诸多问题。
TOML OR YAML?
所以,我们应该使用TOML还是YAML作为工程配置文件呢?对于个人而言,TOML更适合像alacritty这样的小型工程,通常没有过多的嵌套字典,也不太会需要配置时间/日期相关的内容,这样TOML的层次结构就会极其直观。而对于大型工程文件,TOML的优点能够遮蔽其缺点吗?Martin Vejnár(PyTOML的作者)已经帮我们尝试了。
TOML is a bad file format. It looks good at first glance, and for really really trivial things it is probably good. But once I started using it and the configuration schema became more complex, I found the syntax ugly and hard to read.
TOML - Wikipedia
JSON vs. YAML vs. TOML | Martin Ueding
What is wrong with TOML? - HitchDev
The yaml document from hell