你的电脑上有成千上万的配置文件。你可能永远不会直接与它们中的大部分互动,但它们散布在你的/etc 文件夹和~/.config 、~/.local 和/usr 。可能还有一些在/var ,甚至可能在/opt 。如果你曾经意外地打开过一个配置文件,或者要做一个改变,你可能会想,为什么有些配置文件看起来是这样的,而其他的看起来完全不同。
存储配置是一项灵活的工作,因为只要开发人员知道他们的代码是如何将数据放入文件的,他们就可以根据需要轻松地编写代码来提取这些数据。然而,科技行业慷慨地赞成有据可查的标准化,所以多年来已经发展了几种著名的格式,使配置变得简单。
为什么我们需要配置
配置文件(简称 "配置文件")对现代计算很重要。它们允许你定制你与一个应用程序的交互方式,或者一个应用程序与你系统的其他部分的交互方式。正是因为有了配置文件,当你启动一个应用程序时,它有你喜欢如何使用它的 "记忆"。
配置文件可以是,而且通常是,结构非常简单。例如,如果你要写一个应用程序,而它唯一需要知道的是它的用户喜欢的名字,那么它唯一的一个配置文件可以包含一个词:用户的名字。比如说。
Tux
不过,通常情况下,一个应用程序需要跟踪的信息不止一个,所以配置通常使用一个键和一个值。
NAME='Tux'
SPECIES='Penguin'
即使没有编程经验,你也可以想象代码如何解析这些数据。这里有两个简单的例子,一个使用awk ,另一个使用grep命令,只关注包含NAME"键 "的那一行,并返回出现在等号后的 "值"(= )。
$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
'Tux'
$ grep NAME fake.txt | cut -d'=' -f2
'Tux'
这一原则同样适用于任何编程语言和任何配置文件。只要你有一个一致的数据结构,你就可以编写简单的代码,在必要时提取和解析它。
选择一种格式
为了广泛有效,关于配置文件最重要的是它们是一致的和可预测的。你最不想做的事情是在保存用户偏好的名义下将信息转储到一个文件中,然后花几天时间编写代码来逆向分析文件中出现的随机信息。
有几种流行的配置文件格式,每一种都有自己的优势。
INI
INI文件的格式是键和值对。
[example]
name=Tux
style=widgety,fidgety
enabled=1
这种简单的配置方式很直观,唯一的混乱点是键名不对(例如,像unampref ,而不是name )。它们易于解析,易于编辑。
INI格式除了键和值之外还有一些部分。在这个示例代码中,[example] 和[demo] 是配置部分。
[example]
name=Tux
style=widgety,fidgety
enabled=1
[demo]
name=Beastie
fullscreen=1
这在解析上要复杂一些,因为有_两个_ name 键。你可以想象,一个粗心的程序员在查询这个配置文件的name ,得到的结果总是Beastie ,因为那是文件定义的最后一个名字。当解析这样的文件时,开发者必须小心翼翼地在章节内搜索键值,这可能很棘手,取决于用于解析文件的语言。然而,它是一种足够流行的格式,大多数语言都有一个现有的库来帮助程序员解析INI文件。
YAML
YAML 文件是结构化的列表,可以包含值或键和值对。
---
Example:
Name: 'Tux'
Style:
- 'widgety'
- 'fidgety'
Enabled: 1
YAML 之所以流行,部分原因是它看起来很干净。它没有太多的语法,除了你把数据放在与之前数据相关的地方。然而,对某些人来说是一种特性,对另一些人来说则是一种错误,许多开发人员避免使用YAML,因为它对本质上_不存在_的东西具有重要性。如果你在YAML中把缩进弄错了,YAML解析器可能会把你的文件看成是无效的,即使它被容忍了,也可能会返回不正确的数据。
大多数语言都有YAML解析器,并且有很好的开源YAML linters(验证语法的应用程序)来帮助你确保YAML文件的完整性。
JSON
JSON文件在技术上是YAML的子集,所以它的数据结构是相同的,尽管其语法完全不同。
{
"Example": {
"Name": [
"Tux"
],
"Style": [
"widgety",
"fidgety"
],
"Enabled": 1
}
}
JSON在JavaScript程序员中很受欢迎,这并不奇怪,因为JSON是JavaScript Object Notation的缩写。由于与网络开发密切相关,JSON是网络API的一种常见输出格式。大多数编程语言都有库来解析JSON。
XML
XML使用标签作为围绕配置值的键。
<example>
<name>Tux</name>
<style priority="user">widgety</style>
<style priority="fallback">fidgety</style>
<enabled>1</enabled>
</example>
XML经常被Java程序员使用,而且Java有一套丰富的XML解析器。虽然它有相当严格的声誉,但XML同时也非常灵活。不像HTML,它有一套允许你使用的标签,你可以任意地发明你自己的XML标签。只要你的结构一致,并且有一个好的库来解析它,你就可以精确而轻松地提取你的数据。
有一些好的开放源码linters来帮助你验证XML文件,而且大多数编程语言都有一个库来解析XML。
二进制格式
Linux为自己的纯文本配置感到自豪。它的优点是你可以用猫等基本工具看到配置数据,你甚至可以用你喜欢的文本编辑器编辑配置。
不过,有些应用程序使用二进制格式,这意味着数据是以某种非自然语言的格式编码的。这些文件通常需要一个特殊的应用程序(通常是它们要配置的应用程序)来解释它们的数据。
你不能查看这些文件,至少不能以任何有意义的方式查看,你也不能在其主机应用程序之外编辑它们。采用二进制格式的一些原因是。
- **速度。**程序员可以使用自定义符号在二进制配置文件的某些点上注册特定的信息位。当数据被提取出来时,不需要进行搜索,因为所有的东西都已经有了索引。
- **大小。**文本文件可以变得很大,如果你选择压缩一个文本文件,你在功能上就把它变成了二进制格式。二进制文件可以通过编码的技巧变得更小(文本文件也是如此,但在某些时候,你的优化使你的数据如此模糊,以至于它可能是二进制的)。
- 混淆。一些程序员甚至不想让人们看他们的配置文件,所以他们把它们编码为二进制数据。这通常只能成功地使用户感到沮丧。这并不是使用二进制格式的一个好理由。
如果你必须使用二进制格式进行配置,请使用已经作为开放标准存在的格式,如NetCDF。
找到可行的方法
配置格式帮助开发者存储他们的应用程序需要的数据,并帮助用户存储他们希望应用程序如何行动的偏好。对于你应该使用什么格式的问题,可能没有错误的答案,只要你觉得你所使用的语言对你有很好的支持。在开发你的应用程序时,看看可用的格式,对一些样本数据进行建模,审查和评估你的编程语言所提供的库和工具,然后选择你最有信心的那一种。