适合人类编写: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这三种格式用来做配置文件优缺点的更多相关文章

  1. Golang 入门系列(九) 如何读取YAML,JSON,INI等配置文件

    实际项目中,读取相关的系统配置文件是很常见的事情.今天就来说一说,Golang 是如何读取YAML,JSON,INI等配置文件的. 1. json使用 JSON 应该比较熟悉,它是一种轻量级的数据交换 ...

  2. 彻底了解构建 JSON 字符串的三种方式

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7701856.html 前言:JSON 是轻量级的数据交换格式,很常用,尤其是在使用 Ajax ...

  3. iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明

    iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...

  4. Notepad++中Windows,Unix,Mac三种格式

    Notepad++中Windows,Unix,Mac三种格式之间的转换 http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htm ...

  5. Mysql Binlog三种格式介绍及分析【转】

    一.Mysql Binlog格式介绍       Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...

  6. 【转】Notepad++中Windows,Unix,Mac三种格式之间的转换

    原文网址:http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/htmls/npp_func_windows_unix_mac.ht ...

  7. SIM卡中UCS2编码的三种格式(80,81,82)分析

    网上看到一篇比较好的说ucs2编码的文章,保存一下,原文地址: http://hi.baidu.com/youren4548/blog/item/fa08bd1bf61005058618bf1d.ht ...

  8. 三种LVS负载均衡技术的优缺点----负载均衡调度算法

    三种LVS负载均衡技术的优缺点归纳以下表: VS/NATVS/TUNVS/DR 服务器操作系统任意支持隧道多数(支持Non-arp) 服务器网络私有网络局域网/广域网局域网 服务器数目(100M网络) ...

  9. 三种Tomcat集群方式的优缺点分析

    三种Tomcat集群方式的优缺点分析 2009-09-01 10:00 kit_lo kit_lo的博客 字号:T | T 本文对三种Tomcat集群方式的优缺点进行了分析.三种集群方式分别是:使用D ...

随机推荐

  1. Oracle in与exist条件分析

    select ...from user in('a','b','c'):in支持多个条件同时查询

  2. Alpha冲刺1

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9948330.html 作业博客:https://edu.cnblogs.com/campus/ ...

  3. MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决

    问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...

  4. 解决VS2010使用mscomm控件无法接收数据的问题

    如果你正在使用2010,并且想用mscomm控件,遇到如下问题,那你可以看看这篇文章: 1. 添加了mscomm控件以及对应的控件变量以后发现以前mscomm的成员函数,类似setsettings() ...

  5. 搭建Django项目

    命令行搭建Django项目 1.安装django 在指定解释器环境下安装django 1.11.9 在真实python3环境下: pip3 install django==1.11.9 在虚拟环境下: ...

  6. Delphi 10.3.1 TNetHttpClient在多线程中存在的问题及解决方法。

    Delphi 10.3.1发布了,对10.3.0存在的各种问题,做了大量的修正.但听高勇说TNetHttpClient在多线程中存在问题,今天做了一下测试,确实如此,看来,还需要官方进一步修正! 具体 ...

  7. mysql增删改查练习

    Mysql增删改查sql语句练习 关于数据库的一些操作: 进入mysql 命令行: mysql -uroot –p 查看所有数据库: show databases; 创建数据库: create dat ...

  8. ubatu 安装nodejs npm liveserver

    更新ubuntu软件源 sudo apt-get update sudo apt-get install -y python-software-properties software-properti ...

  9. Python学习笔记第二十二周(前端知识点补充)

    目录: 一.伪类 二.样式 1.字体 2.背景图片 3.margin和padding 4.列表属性 5.float 6.clear 7.position 8.text-decoration(a标签下划 ...

  10. s21day03 python笔记

    s21day03 python笔记 一.昨日内容回顾及补充 回顾 补充 运算符补充 in 在里面 not in 不在里面 优先级补充(>优先于not) 二.整型(int) 数字表示 python ...