常用配置文件
在软件开发中,配置文件是连接代码静态世界(编译后的代码)和运行时动态环境的桥梁,是管理复杂性和变化的关键工具。选择一个合适的配置文件也是软件开发中的一个关键架构决策。
一、.ini(Initialization File)
.ini文件是一种非常古老且简单的无标准正式规范(但有着广泛共识)的配置格式,应该是最简单的配置文件了,采用简单的节([section])和键值对([key=value])结构,仅支持单层嵌套,适合扁平化的配置。语法极简,易于手动编辑,但仅支持字符串类型。
规范要求:
- 使用方括号
[]
括起来,表示一个配置区块(节)。节名独占一行; - 键值对(key-value)格式为
key = value
或‘key : value’,等号(‘=’)更常见,同一节中键需唯一; - 节名、键名、值名均为大小写敏感;
- 允许使用
;
或#
开头,注释整行; - 没有原生数据类型支持,所有值均为字符串;
- 一般不允许多行值(ini文件追求简单,建议根据应用进行切割使用单行值);
示例配置:
; 这是一个数据库配置的INI示例
[database]
server = 192.168.1.1
port = 3306
username = root
password = 123456
enable = true[application]
name = My App
log_level = debug ; 这是一个行内注释
注:许多的.conf,.cfg文件本质还是.ini格式,一些简单的自定义配置文件也建议遵循该规范,方便约束和解析。
二、.toml(Tom’s Obvious, Minimal Language))
TOML 旨在成为一个更明确、易于读写的迷你语言。它是 INI 的超集,提供了严格的标准和丰富的原生数据类型。增加了对多层嵌套结构支持,通过表([table])和点分隔符([table.subtable])组织层次结构;原生支持了整数、浮点数、布尔值、日期时间、数组等强类型。
规范要求:
- 使用方括号
[]
括起来,表示一个配置区块(节)。节名独占一行; - 支持使用‘[table.subtable]’方式定义多层嵌套结构;使用
[[array_of_tables]]
定义表数组; - 键值对(key-value)格式为
key = value
,同一节中键需唯一; - 支持多种数据类型,比如:
- 字符串:“Hello”, ‘World’,“”“多行字符串”“”
- 整数:12,32,-56
- 浮点数:3.14
- 布尔值:true,false
- 偏移日期:2025-09-03T09:00:00Z
- 字面量(不转义):“C:\Users\admin”
- 数组:[ 1, 2, 3, ]
- 内联表:inline = { key = “value”, num = 42 }
- 使用
#
表示注释;
示例配置:
# 这是一个TOML配置示例
title = "TOML Example"[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true[servers][servers.alpha] # 子表ip = "10.0.0.1"dc = "eqdc10"[[products]] # 表数组
name = "Hammer"
sku = 738594937[[products]]
name = "Nail"
sku = 284758393
color = "gray"
三、.json(JavaScript Object Notation)
JSON文件时一种更加广泛使用的轻量级数据交换格式,源于JavaScript,现已独立于语言。其规范由RFC 8259定义,对JSON的语法、数据类型都做了严格的定义和约束。JSON的设计目标简洁性和语言独立性,使其成为Web API和配置文件的常用格式。
规范要求:
- 支持
键值对集合
(对象,用{}
表示)和值的有序列表
(数组,用[]
表示); - 键类型只能为字符串,且必须用双引号
""
包括起来; - 值类型可以为字符串、数字、布尔值、数组、对象或
null
; - 键值之间使用
key : value
的方式,键值对(对象)之间使用,
分割,最后一个键值对(对象)后不允许尾随逗号; - 不支持注释(新规范支持),一般使用特定的key标识注释;
示例配置:
{"database": {"server": "192.168.1.1","ports": [8001, 8001, 8002],"connection_max": 5000,"enabled": true,"credentials": {"username": "root","password": "123456"}},"application": {"name": "My App","log_level": "debug"}
}
四、.yaml(YAML Ain’t Markup Language)
YAML时一种强调人类可读性的数据序列化格式,常用于配置文件和复杂的数据结构。
规范要求:
- 使用空格缩进(通常两个空格)来表示层级关系;
- 数据类型支持标量(Scalars)、序列(Sequences)、映射(Mappings)
- 标量(Scalars):字符串、数字、布尔值等。(字符串可以不用双引号标识)
- 序列(Sequences):及数组,使用短划线
-
表示列表项。(短划线-
后面必须有一个空格) - 映射(Mappings):即对象,使用
key: value
表示。(冒号`:后面必须有一个空格)
- 支持多行字符串
- 使用
|
符号可以保留字符串中的换行符; - 使用
>
符号可以将字符串中的换行符替换为空格; - 使用
|+
或>+
可以保留所有尾部空行; - 使用
|-
或>-
可以删除所有尾部空行;
- 使用
示例配置:
# 这是一个YAML配置示例
database:server: "192.168.1.1"ports:- 8001- 8001- 8002connection_max: 5000enabled: truecredentials:username: rootpassword: "123456" # 数字最好用引号括起来,否则会被解析为整数application:name: My Applog_level: debugdescription: |This is a multi-linestring that preservesline breaks.
五、.xml
XML是一种历史悠久的标记语言,设计宗旨是传输和存储数据,其焦点是数据的结构和含义。它最大的优点就是非常的强大和严谨,但这也是它的缺点:相对其他配置文件会显得特别冗余和复杂。
规范要求:
- 所有的数据需要被包括在开始标签
<tag>
和结束标签</tag>
中; - 标签极其内容称为一个元素。元素可以嵌套;空元素可以用
<empty />
表示; - 开始标签中可以包含属性,格式为
name="value"
; - 一般以
<?xml version="1.0" encoding="UTF-8"?>
开头,表示XML文档; - 支持注释:
<!-- 这是一个注释 -->
;
配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<config><database server="192.168.1.1" enabled="true"><ports>8001</ports><ports>8001</ports><ports>8002</ports><connection_max>5000</connection_max><credentials><username>root</username><password>123456</password></credentials></database><application><name>My App</name><log_level>debug</log_level></application>
</config>
六、总结
- 追求极简和兼容性可以用ini;
- 对INI配置文件进行增强可以用toml;
- 方便在机器间(进程间)传递可以优先选择json(代码解析方便,应用很广泛);
- 配置复杂,并优先保证人类的可读性优先选择yaml;
- 对结构、格式有严格的要求,侧重数据存储优先选择xml(旧系统使用的多些);