TOML配置文件,可能是目前 YAML 最有力的竞争者

TOML是在 2013 年发布的配置文件格式。距今虽然有10年历史了,但是之前一直没有在大项目中见过的。我是前段时间在看python的pep规范,无意中看到了这种配置文件格式,稍微了解了一下,才发现现在有很多新的明星项目都喜欢用它来做配置文件。

1、有rust语言的包管理工具cargo;

2、类似于docker的容器工具containerd;

3、go语言很多项目都喜欢用。比如静态网站生成工具Hugo、数据库InfluxDB、GitLab CI。

4、python项目也开始接纳。包管理工具 pip、pipenv和Poetry都是用的TOML,[1]现在连官方的metadata管理也开始支持toml。

1. 一个小例子

为什么新项目这么喜欢 TOML 呢? 让我们先来看一个TOML的小例子吧,看完了说不定你就知道了。

  [project]
	  name = "spam"
	  version = "2020.0.0"
	  description = "Lovely Spam! Wonderful Spam!"
	  readme = "README.rst"
	  requires-python = ">=3.8"
	  license = {file = "LICENSE.txt"}
	  keywords = ["egg", "bacon", "sausage"]
复制代码

有没有感觉很熟悉呢?它和ini格式的配置文件几乎一模一样。要知道互联网发展到今天,大多数有影响力的项目都是采用ini这种配置文件格式,如果你之前有接触过ini,切换到toml几乎是0成本。

那为什么不直接用ini呢?因为ini格式支持的数据类型非常少,配置项的值都会被默认当成字符串,如果想表示数字、数组,还需要自己进行额外的解析。

但是在TOML中,数据类型非常丰富: 字符串 注释 数字 布尔值 数组 哈希表 甚至连时间格式都支持

2. 字符串

字符串我们当然不会陌生,但是如果你是从ini格式转过来的,一定要注意字符串值要加引号。

键默认会当成字符串处理,可以加也可以不加。 加引号的键叫引号键(Quoted Key),不加引号的键叫裸键(Bare Key)。

TOML 格式非常灵活,对于灵活的语言,最好的方式是给自己设置规范和纪律,一直用好一种用法,不然很容易学废。官方推荐我们尽量用裸键,当裸键不能正确表达意思的时候,再用引号键。

	  name = "spam"     #OK
	  name_1 = spam     #错误
	  "name_2" = "spam" #OK
复制代码

裸键只能包含 ASCII 字母,ASCII 数字,下划线和短横线(A-Za-z0-9_-),引号键则可以支持特殊字符,甚至是空格。当键中包含特殊字符的时候,使用引号键。

	  'name@! erf:' = 'spam' # OK
	  name@! erf: = 'spam'   # 错误
复制代码

当字符串为多行字符串时使用三引号,会自动换行:

	  name = """
	  this is a
	  new line 
	  command"""
复制代码

得到的结果是:

	  this is a
	  new line
	  command
复制代码

如果不想自动换行,只是想增强可读性,可以使用折行符号\

	  name = """
	  this is a \
	  new line \
	  command"""
复制代码

得到结果是不换行的:

	  this is a new line command
复制代码

3. 数字

如果你都会编程了,数字应该会知道怎么表示。

	  age1 = 18
	  age2 = -2
	  age3 = +16
	  age4 = 11.2
复制代码

toml除了支持10进制表示,还支持二进制(0b)、八进制(0o)、十六进制(0x)

	  age1 = 0b11
	  age2 = 0o12
	  age3 = 0xb
复制代码

上面的解析结果为:

	  {
	    'age1': 3, 
	  'age2': 10, 
	  'age3': 11
	  }
复制代码

4. 布尔

	  bool1 = true
	  bool2 = false
复制代码

5. 时间

时间类型是toml的一大特色,因为绝大多数的配置文件格式都是不支持时间类型的。toml 遵循的是 RFC 3339 时间格式,只要照着格式写,解析出来会自动转成编程语言的时间类型。

	  ts = 2021-01-06 07:30:00
	  ts1 = 2021-01-06 07:30:00.1234
	  time1 = 07:30:00
复制代码

得到的结果:

	  {
	    'ts': datetime.datetime(2021, 1, 6, 7, 30), 
	  'ts1': datetime.datetime(2021, 1, 6, 7, 30, 0, 123000),
	    'time1': datetime.time(7, 30)
	  }
复制代码

6. 数组

数组可以是同类型数据,可以换行,也可以嵌套,和python当中列表简直一模一样。但是要注意,尽量保持元素是同类型的数据

	  users = [	    ['iswy', '男'],
	    ['you', '女'],
	  ]
复制代码

得到结果:

	  {
	  	'users': [	  ['iswy', '男'], 
	  ['you', '女']
	  	]
	  }
复制代码

7. 哈希表

表有点类似于python中的字典:

	  user = {name='iswy', gender='男'}
复制代码

得到的结果:

	  {
	    'user': {
	        'gender': '男', 
	        'name': 'iswy'
	    }
	  }
复制代码

这种写在key后面的表叫内联表。还有一种用法,类似于ini格式中的section,用于分组管理,暂且把它叫做外联表。比如上面的例子,可以换一种形式,得到的结果是完全一样的。

	  [user]
	  gender = '男'
	  name = 'iswy'
复制代码

表支持嵌套,子表可以缩进也可以不缩进:

	  [user]
	    cat = ['admin', 'normal']
	  
	    [user.student]
	    name='iswy'
	    age=19
	  
	    [user.teacher]
	    name='you'
	    age=32
复制代码

如果你觉得这种风格你不喜欢,也可以换成下面的风格:

	  [user]
	  cat = ['admin', 'normal']
	  
	  # student
	  student.name='iswy'
	  student.age=19
	  
	  # teacher
	  teacher.name='you'
	  teacher.age=328
复制代码

一定要注意,当键包含. 号时,一定要加引号

	  site.'x.com' = 'http://x.com'
复制代码

我个人更倾向于子表嵌套的风格,因为这样的表述看起来更加简洁。

表和数组的配套使用

最后我们要考虑的问题是当有多个用户需要配置,我们要使用表数组进行分组呢?

	  [[user]]
	  
	    [user.student]
	    name='iswy'
	    age=19
	  
	    [user.teacher]
	    name='you'
	    age=328
	  
	  [[user]]
	    [user.student]
	    name='iswy2'
	    age=192
	  
	    [user.teacher]
	    name='you2'
	    age=3282
复制代码

得到的结果:

	  {
	    'user': [
	        {
	            'student': {'age': 19, 'name': 'iswy'},
	         	'teacher': {'age': 328, 'name': 'you'}
	        },
	        {
	            'student': {'age': 192, 'name': 'iswy2'},
	            'teacher': {'age': 3282, 'name': 'you2'}
	        }
	    ]
	  }
复制代码

[^1] github.com/toml-lang/t…

学习安排上

作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件自动化测试的学习资源,希望能给你前进的路上带来帮助。【无套路免费白嫖】

视频文档获取方式:

这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Node.js中,可以使用toml模块来解析和生成toml格式的配置文件,因此可以通过Node.js来实现点击修改toml格式的配置文件的功能。以下是一般的实现思路: 1. 创建一个API接口,用于接收来自客户端的修改请求,并将修改后的内容写入配置文件。 2. 在客户端使用Ajax或Fetch等技术,向服务器端发送修改请求。请求的参数可以包括要修改的配置项名称和修改后的值。 3. 在服务器端接收到修改请求后,使用toml模块读取配置文件的内容,并将修改后的内容写入到文件中。这里需要注意的是,要保证对文件的写入操作是安全的,需要进行一些权限控制和错误处理。 4. 返回修改结果给客户端,通常会返回一个布尔值或者一些错误信息,以便客户端进行下一步处理。 下面是一个简单的示例代码,用于修改toml格式的配置文件: ``` const fs = require('fs'); const toml = require('toml'); // 定义API接口,用于接收修改请求 app.post('/api/config', (req, res) => { const { key, value } = req.body; // 获取请求参数 // 读取配置文件 const config = toml.parse(fs.readFileSync('config.toml', 'utf8')); // 修改配置项的值 config[key] = value; // 将修改后的内容写入文件 fs.writeFileSync('config.toml', toml.stringify(config)); // 返回修改结果 res.json({ success: true }); }); ``` 需要注意的是,由于涉及到文件操作,需要特别小心防止文件损坏或数据丢失。因此,在实现过程中需要使用一些安全的技术和方法来保证文件的完整性和安全性,例如备份、加锁、权限控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值