你的电脑上有成千上万个配置文件。你可能永远不会直接与其中的大部分交互,但它们散布在你的 /etc
文件夹和 ~/.config
以及 ~/.local
和 /usr
中。/var
甚至 /opt
中可能也有一些。如果你曾经意外打开过一个配置文件或者为了进行更改而打开过,你可能想知道为什么有些配置文件看起来是一种方式,而另一些配置文件看起来则完全不同。
存储配置是一项灵活的任务,因为只要开发人员知道他们的代码如何将数据放入文件,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业慷慨地支持有据可查的标准化,因此多年来演变出了几种著名的格式,使配置变得容易。
为什么我们需要配置
配置文件(简称“config files”)对于现代计算至关重要。它们允许你自定义与应用程序的交互方式或应用程序与系统其余部分的交互方式。正是由于配置文件,你每次启动应用程序时,它都“记住”了你喜欢如何使用它。
配置文件可以是,而且通常是,结构非常简单的。例如,如果你要编写一个应用程序,而它唯一需要知道的是用户的首选名称,那么它的唯一配置文件可以只包含一个单词:用户的姓名。例如
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 linter(用于验证语法的应用程序)来帮助你确保 YAML 文件的完整性。
JSON
JSON 文件在技术上是 YAML 的子集,因此其数据结构是相同的,尽管其语法完全不同
{
"Example": {
"Name": [
"Tux"
],
"Style": [
"widgety",
"fidgety"
],
"Enabled": 1
}
}
JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 代表 JavaScript 对象表示法。由于与 Web 开发紧密相关,JSON 是 Web 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 不同,HTML 有一组允许你使用的标签,你可以任意发明你自己的 XML 标签。只要你以一致的方式构建它并有一个好的库来解析它,你就可以精确而轻松地提取你的数据。
有一些很好的开源 linter 可以帮助你验证 XML 文件,并且大多数编程语言都有一个库来解析 XML。
二进制格式
Linux 以纯文本配置而自豪。优点是你可以使用像 cat 这样的基本工具查看配置数据,你甚至可以使用你最喜欢的文本编辑器编辑配置。
但是,有些应用程序使用二进制格式,这意味着数据以某种非自然语言的格式编码。这些文件通常需要一个特殊的应用程序(通常是它们旨在配置的应用程序)来解释它们的数据。
你无法查看这些文件,至少无法以任何有意义的方式查看,并且你无法在宿主应用程序之外编辑它们。采用二进制格式的一些原因是
- 速度:程序员可以使用自定义表示法在二进制配置文件的特定点注册特定的信息位。当数据被提取时,不涉及搜索,因为一切都已索引。
- 大小:文本文件可能会变得很大,如果你选择压缩文本文件,你实际上是在将其转换为二进制格式。二进制文件可以通过编码技巧做得更小(文本文件也是如此,但在某些时候,你的优化会使你的数据变得如此晦涩难懂,以至于它可能就是二进制的)。
- 混淆:有些程序员甚至不想让人查看他们的配置文件,因此他们将它们编码为二进制数据。这通常只会让用户感到沮丧。这不是使用二进制格式的好理由。
如果你必须使用二进制格式进行配置,请使用已经作为开放标准的格式,例如 NetCDF。
找到适合你的方案
配置格式帮助开发人员存储他们的应用程序所需的数据,并帮助用户存储他们希望应用程序如何操作的首选项。对于你应该使用哪种格式的问题,可能没有错误的答案,只要你觉得你使用的语言提供了良好的支持即可。在开发应用程序时,查看可用的格式,建模一些示例数据,审查和评估你的编程语言提供的库和实用程序,并选择你感觉最自信的一种。
评论已关闭。