yaml,json,ini这三种格式用来做配置文件优缺点

摘要:
事实上,yaml的实现相对简单,即简单的文本替换,这导致了我想谈论的下一点被HOCON分解。5.可以继承的是,这是HOCON爆炸其他语言的地方。

适合人类编写:ini > toml > yaml > json > xml > plist
可以存储的数据复杂度:xml > yaml > toml ~ json ~ plist > ini

作者:赵扶摇
链接:https://www.zhihu.com/question/41253282/answer/119857880
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

其实我觉得这三者,甚至包括xml,都不是很好的配置文件格式

在小一点的工程中,我可能会考虑yaml,但个人强烈推荐的一个配置文件格式就是HOCON(Human-Optimized Config Object Notation)
是由typesafe(开发scala和play framework的公司)主导的项目:
GitHub - typesafehub/config: Configuration library for JVM languages

在Google干过的同学可以参考GCL,会发现很多设计上的类似点。

我觉得比较完美的配置文件格式需有这些特性

  1. 语法要简单,灵活

简单大家都差不多

HOCON是JSON和java property的超集,最为灵活,你可以写
a: {
 b: {
  c: 3
  d: 4
 }
}
也可以单独写
a.b.c=5

":"号也可以换成"="或者就完全省略

2. 能够写注释,这点json简直可悲,不过可以考虑加预处理的过程

3. 能够比较方便的覆盖参数值(方便书写或者debug),比如说在config文件中定义了
a=1

可以在运行的时候,通过类似 program -Da=2或者a=2 program的的方式来覆盖参数值,而不需要跑去修改配置文件本身

这一点HOCON完爆其他的几种

4. 能够重用配置片段,比较大一点的project中,经常有很多地方的配置需要保持一致,最好的办法就是引入变量和引用的概念,比如可以类似
db_connection: {host: a, password: b, db_name: c, ..... }

service_a: {
  host: yyy
  db: $db_connection
}

service_b: {
  host: yyy
  db: $db_connection
}

这样最大的好处是避免了copy and paste,在修改配置文件的时候能搞保证不出问题

这点yaml和hocon基本上都是做的不错的,json没有,ini我用的不多,好像是没有。
yaml的实现其实比较简单,就是单纯的文本替换,这样导致我要说的下一点被HOCON完爆。

5,可以继承
这是HOCON完爆其他语言的地方。还是上面那个例子,假设service_b.db不仅仅是是要是用全局db_connection的值,要稍微修改其中host的值,可以
service_b: {
  host: yyy
  db: $db_connection {
    host: abc
  }
}

而且不需要重新copy and paste之前所有的内容

它的继承非常强大,语义可以说基本上和普通OO语言没有太大区别

另外HOCON可以包含文件,比如说你可以写一个基础的配置文件base.conf,然后再针对dev,staging和production分别做一份不同的文件,这样可以很轻松地做到在不同的环境下,用不同的配置而且没有重复的配置代码,比如说
include 'base.conf'

// 覆盖默认值
db.connection = "product_machine:2000"
....

免责声明:文章转载自《yaml,json,ini这三种格式用来做配置文件优缺点》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 程序软件启动默认管理员权限。接口测试中,json格式的报文发送时提示报文格式错误下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows中如何读写INI文件

1.INI文件写入函数 BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName,LPCTSTR lpString, LPCTSTR lpFileName); lpAppName:INI文件中的一个字段名,也可以有多个字段名,通过这个字段名才能继续去操作我们的键值 lpKeyNa...

Python--命令行参数解析Demo

写没有操作界面的程序时,最讨厌的就是参数解析问题,尤其是很多参数那种,下面是一个小Demo,拿出来与各位分享: 1 # -*- coding:utf8 -*- 2 import os 3 import datetime 4 import sys 5 from optparse import OptionParser 6 7...

使用Elasticsearch的processors来对csv格式数据进行解析

来源数据是一个csv文件,具体内容如下图所示: 导入数据到es中 有两种办法,第一种是在kibana界面直接上传文件导入 第二种方法是使用filebeat读取文件导入 这里采用第二种办法 配置文件名:filebeat_covid19.yml filebeat.inputs: - type: log paths: - /covid19/covid...

ansible自动化运维详细教程及playbook详解

运维自动化工具( 配置管理 ),例如:Ansible、SaltStack、Puppet、Fabric 等。 Ansible简介 一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。 Ansible 基于 Python 语言实现...

MySQL-快速入门(11)用户管理

1、权限表 存储用户权限信息表主要有:user、db、host、tables_priv、columns_priv、procs_priv。 1》user表: 记录允许连接到服务器的账号信息,里面的权限是全局级别的。user表有42个字段,这些字段可以分为4类,分别是用户列、权限列、安全列、资源控制列。 2》db和host表 3》tables_priv和col...

Linux 修改PostgreSQL外部访问白名单

1. 查找配置文件 # find / -name pg_hba.conf # find / -name postgresql.conf 2.修改 2.1 修改pg_hba.conf 查找IPv4 local connections 修改默认的 host all all 127.0.0.1/32 trust 为 host all all 192.168.1...