一个服务的配置文件用什么格式(比如 xml, json, yaml)比较好?

5 天前
 chesha1

很多服务需要一个配置文件,有一些常见格式:

一个服务用什么格式的配置文件,这个有什么考量吗?用什么比较好?

2990 次点击
所在节点    程序员
55 条回复
abcbuzhiming
3 天前
@GeekGao 我手上并没有,但是老外的社区说过不止一次这个问题,想来不是空穴来风
iorilu
3 天前
简单的就是.env, 其他都用 toml
mark2025
3 天前
@kenvix k8s 那些上百行的 yml 的确很恶心,这种场景用 toml 似乎好得多
mark2025
3 天前
@kenvix 可为啥对 py 的缩进很多人就接受呢。 哈哈~~~
chinni
3 天前
adguard 的 yaml 配置 我后台里配置了几千条记录 然后打开配置文件 基本没法看
X_Del
3 天前
https://noyaml.com/ 解释的很明白了,为什么不要用 YAML 。
YAML 看起来很简单,实际上非常复杂,很多东西都藏在水下:

- YAML 1.1 中 true 和 false 有 22 种表达方式( https://yaml.org/type/bool.html
- 多行字符串到底有多少种写法( https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines/21699210#21699210
- 字符串不严格要求引号,这个例子来自 https://www.arp242.net/yaml-config.html

```
python: 3.5.3 # => 字符串 "3.5.3"
postgres: 9.3 # => 数字 9.3
```

- 由于 YAML 1.2 规范过于复杂,几乎没有一个 YAML parser 能完美地实现 YAML 1.2 ( https://matrix.yaml.info
ns09005264
3 天前
bspwm 的配置文件是 shell 脚本,bspwm 本身是 daemon 类型的软件,通过客户端 bspc 与 bspwm 通信实时变更相应的配置。所以可以把一堆 bspc 的操作命令放到 shell 脚本里执行,就相当于配置了。

类似的还有:
neovim 是用 lua 语言作为配置
nixos 是用 nix 语言作为配置
kenvix
3 天前
@GeekGao #35 我写了 8 年 java ( xml 宇宙)、7 年 python (缩进宇宙)、4 年 kotlin ( dsl 宇宙),我认为 yaml 和 python 可读性都是一坨屎。作用域对人类不明确,特别是从外面抄代码时,IDE 根本不能把代码放到正确的意图位置
GeekGao
3 天前
@kenvix 可读性的定义,不是你 COPY 代码的时候作用域好不好找。可写性指的是编写代码的容易程度。

具有良好可读性的语言可以带来的优势:

更容易理解和维护代码
减少错误的可能性
提高团队协作效率
降低学习曲线

所以,仅凭你的回复,我并认可你对 Python/YAML 可读性的解读(虽然我理解从排版错误的地方 COPY 代码会出错的这个问题)
GeekGao
3 天前
@kenvix 而且,我刚开始写代码的时候,在 Linux 环境下使用 VIM ,Java 这种语言脱离 IDE 根本就无效率可言,更不要说什么可读性了。 况且啊,Python 出现的时间早于 Java 这套体系。

锁进这种设计也是有历史缘故的。90 年代初期,可没有啥好用的 IDE 吧。X11 逐步普及*nix 后才有人搞 GUI 类的编辑器啊。不能脱离历史讲优劣。从 Sun 发布的 Java Workshop 、Eclipse…… 到 Jetbrains 全家桶。这个对工具效率提升的能力跨度,不是隔夜就达成的。
kenvix
3 天前
@GeekGao #49 确实,我是从 copy 的角度切入举例 yaml 可读性差的的问题,这个切入点可能是不合适的,切到 yaml 可写性极差的问题了。
但是这玩意可读性是真的差,没有高亮括号导致很难瞬间快速定位到当前所在的作用域的范围,必须额外费力观察缩进才能知道当前作用域是哪些
注释掉的 yaml 代码,可读性更是地狱了
GeekGao
3 天前
@kenvix YAML 早期我也讨厌(更喜欢 JSON 这种通用配置,或者 INI 这种早期我学 Windows 开发的时候的概念) 我是玩了 k8s 后才逐步接受 YAML 的。

关于缩进问题,历史上有太多的争论了,我觉得个人偏好还是不一的,这个没啥科学说法,coding 时开心舒适就好。
kenvix
3 天前
@GeekGao #52 K8S 的缩进嵌套深度姑且还在正常范围,主要是 CI/CD 的那个 yaml 真是写的高血压,不知道是哪个大聪明拍脑袋决定的🤣
phx13ye
2 天前
@GeekGao "一个大类下面子类的数量,多到可以横跨好几个屏幕高度。"

openclash ,机场订阅和转换模板结合后最终生成的那个 yaml 配置
seedhk
1 天前
突然想起有个国产框架叫做 Nutz ,他的配置文件是写在 js 里的,类似:
{
obj:{
xxx:xxx
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1073113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX