V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
gino86
V2EX  ›  程序员

不知道使用 yaml 有什么好处

  •  1
     
  •   gino86 · 2018-11-24 14:58:20 +08:00 · 14013 次点击
    这是一个创建于 2225 天前的主题,其中的信息可能已经有所发展或是发生改变。

    纯吐槽,现在越来越多的配置文件使用 yaml 格式,不知道有什么好处(结构更清晰?)
    例如,ubuntu 的网络配置方式到 1804 之后就推荐使用 netplan,netplan 的配置文件就是 yaml 格式
    ansible 可用的配置文件方式有两种,一种是 ini,另一种是 yaml,个人认为 ini 格式更加简短,使用 yaml 又(结)长(构)又(清)臭(晰),但 playbook 只能使用 yaml。
    另外,yaml 好像不支持 tab,曾经就因为这个原因出过错,使用 vim 编辑就需要 set expandtab

    78 条回复    2018-12-05 09:06:13 +08:00
    salamanderMH
        1
    salamanderMH  
       2018-11-24 15:02:47 +08:00
    YAML (YAML Ain't Markup Language) is a human-readable data serialization language
    gino86
        2
    gino86  
    OP
       2018-11-24 15:05:28 +08:00
    @salamanderMH 不觉得它可读性好在哪里
    lihongjie0209
        3
    lihongjie0209  
       2018-11-24 15:08:15 +08:00   ❤️ 2
    同感

    人类可读性的话用 DSL

    机器可读性的话用 JSON
    zhangbohun
        4
    zhangbohun  
       2018-11-24 15:09:04 +08:00 via Android   ❤️ 1
    同感,很不直观
    gino86
        5
    gino86  
    OP
       2018-11-24 15:11:40 +08:00
    @lihongjie0209 就是。而且这种文件很容易写错
    wly19960911
        6
    wly19960911  
       2018-11-24 15:12:19 +08:00   ❤️ 1
    你不喜欢的就不够好吗,同理可以很多推论,我不喜欢 GO 语言,所以我认为 GO 不好,我不喜欢 python 的非 C 语法,所以我认为 python 不好。另外工具不会用,不会设置的错也归到语法上吗。

    ini 那个格式,看样子只支持一层结构,数据结构变成树就没法处理了。
    hsfzxjy
        7
    hsfzxjy  
       2018-11-24 15:13:05 +08:00 via Android
    感觉 JSON 更易读
    blankme
        8
    blankme  
       2018-11-24 15:13:12 +08:00
    不仅可读性差,可写性也差(不支持 tab ),非常反人类。。。
    ysc3839
        9
    ysc3839  
       2018-11-24 15:13:17 +08:00 via Android
    相比 ini,yaml 解决了多行文本和数组的问题。
    gino86
        10
    gino86  
    OP
       2018-11-24 15:14:29 +08:00
    @wly19960911 反正编写这种文件的工作量更大,越是接触得多就越觉得没有优势
    szq8014
        11
    szq8014  
       2018-11-24 15:15:12 +08:00   ❤️ 1
    这全是习惯而已吧,比如 java 里面包名一般都又臭又长,但是大家虽然吐槽但是还都遵守这样的规则,开发过程中如何在 navigate 中展示就有两种风格



    上 hierarchy 下 flat,分别对应 java 两种常用的配置文件 properties 和 yaml 格式,喜欢哪种就用哪种



    像 yaml 这样的需要配置复杂了才能展示其优点吧,配置项那么短的话好像没啥明显优势。
    就像 python 包名那么短的话上面两种视图也没啥大的区别了。

    INI 不怎么用,搭建 openstack 的时候用得比较多没觉得 ini 多先进呀 0.0
    zhantss
        12
    zhantss  
       2018-11-24 15:15:38 +08:00 via Android   ❤️ 2
    yaml 存储数据的复杂度比 json 好,ini 就更低了
    相对来说 yaml 的编写难度比 json 好一点,ini 当然最好写
    主要是数据复杂度和人编写难度取一个平衡吧,playbook 复杂度需求还是挺高的
    然后开发人员一般拍脑门决定配置文件,所以嘛。。。
    gino86
        13
    gino86  
    OP
       2018-11-24 15:15:40 +08:00
    @ysc3839 所以它不是为了可读性而生
    Archeb
        14
    Archeb  
       2018-11-24 15:16:38 +08:00
    感觉 json 更好写...可能是因为我写多了
    gino86
        15
    gino86  
    OP
       2018-11-24 15:17:01 +08:00
    @szq8014 没说 ini 先进,只是在完成相同工作的前提下,ini 更加节省时间
    YaphetYin
        16
    YaphetYin  
       2018-11-24 15:19:13 +08:00 via iPhone
    Toml 编写就很简单,rust 用的就是这个
    wly19960911
        17
    wly19960911  
       2018-11-24 15:19:20 +08:00
    @gino86 #10 如果是 JSON 和 YAML 比,我还是认为 JSON 更好,如果是 INI,我认为比不了。
    CRVV
        18
    CRVV  
       2018-11-24 15:26:15 +08:00   ❤️ 3
    YAML 好像是一个比较早出现的这种格式,看起来本来是想做得比 JSON 好写
    因为出现得早,大家都在用
    但是显然缺点太多了,我也觉得还不如 JSON,所以现在更多用 TOML 了
    kslr
        19
    kslr  
       2018-11-24 15:27:10 +08:00
    yaml 对于人类阅读性比 json 好
    weixiangzhe
        20
    weixiangzhe  
       2018-11-24 15:27:17 +08:00 via iPhone
    那就用 toml 吧 yaml 比较 json 也有好多吧, 不用找哪里多了少了都号,那个花括号漏了,不用加那么多的引号 可以注释
    trait
        21
    trait  
       2018-11-24 15:28:41 +08:00 via iPhone
    toml 好很多
    AngelCriss
        22
    AngelCriss  
       2018-11-24 15:29:41 +08:00 via Android   ❤️ 1
    还有个东西叫 hocon,比 JSON 易读写
    yyfearth
        23
    yyfearth  
       2018-11-24 15:36:57 +08:00   ❤️ 1
    @gino86 YAML 只能和 JSON 比 毕竟都支持多层和数组结构 而且支持几种基本的数据类型
    INI 这里就不太具备可比性了 因为 INI 本身不支持多层结构和数组 只能通过键名来模拟
    如果有复杂结构 INI 写起来绝对比 YAML/JSON 痛苦

    我一直觉得 YAML 就是 Python 版的 JSON 写起来稍微舒服一点 而且功能稍微强一点罢了
    功能上来说 常见的也就是 XML 或者类似的标签语言更加强大一些 但是太难读写

    你说的 INI “更加节省时间” 的前提是配置文件结构简单的前提下(没有层次或者只有一层) 否则不见得
    其实楼上说的 TOML 其实就是一个高级版本的 INI 支持结构和数据类型 看起来并没有比 YAML 好到哪里去

    另外 JSON 也有 JSON5 这么一个改进版
    passerbytiny
        24
    passerbytiny  
       2018-11-24 15:39:54 +08:00   ❤️ 2
    ini 直观性最好,并且原生支持大量注释,对非专业人员来说比较友好。然而只有平铺的数据结构,程序解析麻烦(程序并不能将其方便的转换成对象),配置量大的时候也容易被注释淹没,总体来说可读性(尤其是对程序的开发者)并不高。

    json 是最完美的配置方式,配置文件可以无缝的转换成程序使用的对象,但是非专业人员可能看不懂。

    yaml 算是取了上面两个的中间点吧,即让它看起来跟程序使用的对象类似,又让非专业人员只需要几分钟学习就能看懂。

    说到这里我也大致明白了,关键点就是,程序开发者使用方便,所以以后用 yaml 的非商业软件回更多。
    glues
        25
    glues  
       2018-11-24 15:44:44 +08:00   ❤️ 3
    JSON 连注释都不能写,根本不配当配置文件用,ini 这种早该淘汰的东西,就不用再提了
    YAML 最大问题是用缩进来控制结构

    其实好的配置文件格式有很多,只是没流行起来
    ichou
        26
    ichou  
       2018-11-24 15:51:00 +08:00 via iPhone
    YAML 支持大段文本
    autoxbc
        27
    autoxbc  
       2018-11-24 16:07:26 +08:00 via iPhone
    因为我地摊语言 js 的流行,以后配置文件就是标准 es6 模块,内部各种函数计算引用继承装饰,对外导出接口
    via
        28
    via  
       2018-11-24 16:21:44 +08:00 via iPhone   ❤️ 1
    yaml 做配置很好的,但是传递数据还是用 json 比较好,yaml 写起来很舒服,不需要多余的花括号和引号逗号,但是需要注意一下格式,楼下怎么看?
    lovelybear
        29
    lovelybear  
       2018-11-24 16:25:45 +08:00 via Android   ❤️ 1
    Yaml 比 Json 格式简单,但又可以表达清晰的层次结构,而且 yaml 非常容易被构造和生成,无需任何第三方库
    yanjinbin
        30
    yanjinbin  
       2018-11-24 16:29:30 +08:00 via iPhone
    toml 比 yaml 好很多,yaml 有几个规范反直觉
    scofieldpeng
        31
    scofieldpeng  
       2018-11-24 16:37:47 +08:00   ❤️ 1
    我的 github.com/scofieldpeng/config-go 最开始是管理配置 ini 的配置文件,然后当我想兼容 toml 和 yaml 的时候 gg 了,因为 ini 只能一层嵌套==
    paragon
        32
    paragon  
       2018-11-24 16:44:58 +08:00
    配置的时候万一有数组呢? 万一要注释呢?
    1194129822
        33
    1194129822  
       2018-11-24 16:56:22 +08:00 via Android
    @lihongjie0209 json 并不适合机器和人读,取代 xml 只是因为轻量,其实 table[结构化]才是适合人和机器读
    www5070504
        34
    www5070504  
       2018-11-24 17:12:21 +08:00
    ansible 的 yaml 让我想吐血 不过能跟 json 互转还行
    lihongjie0209
        35
    lihongjie0209  
       2018-11-24 17:25:12 +08:00
    @1194129822 JSON 不适合机读有什么证据吗?
    passerbytiny
        36
    passerbytiny  
       2018-11-24 17:26:12 +08:00
    @1194129822 #31 错的离谱
    0987363
        37
    0987363  
       2018-11-24 17:35:59 +08:00 via Android
    用缩进控制逻辑的都是反人类😂 复制后用 vim 格式化一泡亏🤣
    zjp
        38
    zjp  
       2018-11-24 18:21:25 +08:00 via Android
    JSON 满屏的双引号看着就难受,还有末尾不用逗号导致删掉一行要改两行,实在不适合做配置文件。简单的用 ini 或者 properties,复杂的用 YAML
    kaneg
        39
    kaneg  
       2018-11-24 18:24:14 +08:00 via iPhone
    Yaml 是 json 的超集,json 能表示的 yaml 都可以,反之不定。而同等内容的 yaml 对人类而言可读性就好很多,我在 puppet 和 ansible 之间做选择的时候就是因为 yaml 的易读而选择了 ansible。目前 yaml 流行,估计也与 ansible 和 kubernetes 流行有关。
    zjsxwc
        40
    zjsxwc  
       2018-11-24 18:27:22 +08:00 via Android
    xml 表示我还活着
    azh7138m
        41
    azh7138m  
       2018-11-24 18:53:31 +08:00
    @kaneg
    > json 能表示的 yaml 都可以,反之不定

    求一个 yaml 可以表示,但是 json 不能的例子
    kcats
        42
    kcats  
       2018-11-24 18:54:43 +08:00
    只有我一个人觉得 JSON 更好?
    beginor
        43
    beginor  
       2018-11-24 18:58:17 +08:00 via Android
    @azh7138m 多行文本
    beginor
        44
    beginor  
       2018-11-24 19:00:40 +08:00 via Android
    我也觉得 yaml 适合配置,JSON 适合数据传输。 但是 yaml 格式不如 JSON 严谨 。
    VDimos
        45
    VDimos  
       2018-11-24 19:07:06 +08:00 via Android
    我一直以为大家都觉得 yaml 好用,原来这么多人不喜欢
    honeycomb
        46
    honeycomb  
       2018-11-24 19:09:46 +08:00 via Android
    @gino86 yaml 可以直接等价成 json
    kcats
        47
    kcats  
       2018-11-24 19:11:48 +08:00
    @beginor 我倒是觉得 JSON 不适合传输啊, 如果是为了效率的话, mp 或者 pb 都是不错的选择, 如果为了解耦的话, 任何一个自解释的结构都可以, 但是 json 太过于严格了
    sunmonster
        48
    sunmonster  
       2018-11-24 19:45:06 +08:00
    @azh7138m 之前就有看过相关的文章,现存的配置文件多多少少都有问题,json 最大的问题是不支持注释,xml 太臃肿,ini 太简单了,不支持多层次结构,相对来说 yaml 就好得多,还有 toml
    lolizeppelin
        49
    lolizeppelin  
       2018-11-24 19:49:10 +08:00
    机器需要个毛可读性

    配置文件都是在考虑人的可读性 因为是给人看人改的
    只给机器读的配置要考虑的是性能问题

    yaml 也好 json 好都不适合层级过多的配置,因为层级过多人根本看不了
    在少量配置的情况下 yaml 和 json 都优于 ini。
    yaml 可读性么 json 差不多。但是 yaml 格式不容易写错 也容易排错,json 多了还有数不清楚括号的问题

    openstack 这种海量配置的. 最好的方案就是 INI 以及加少层级 配合多文件
    要是 yaml 能解决 openstack 也不会专门弄 cfg 库了

    还有
    ini 可以表达层级的...看看 openstack 里怎么做的就对了


    总之,如果你配置文件有大量层级要表达....你需要重新设计配置文件了
    kingcos
        50
    kingcos  
       2018-11-24 20:02:39 +08:00
    YAML 既然 AML,应该和 XML 比较吧。确实格式更加精简,JSON 不能注释确实麻烦一些,ini 用的不多。。
    YAML 除了缩进来排版格式有时容易弄错,但感觉还是可以接受。。
    lihongjie0209
        51
    lihongjie0209  
       2018-11-24 20:03:25 +08:00
    @kcats 在 UNIX 编程的艺术 这本书中有关于 文本 和 二进制数据格式讨论, 建议看一下. 至于说 JSON 不适合传输, 那么常见的 JSON 载体 HTTP 更不适合传输了.
    lihongjie0209
        52
    lihongjie0209  
       2018-11-24 20:03:55 +08:00
    @lolizeppelin 我一直很困惑说这话的人: 机器可读性??
    wweir
        53
    wweir  
       2018-11-24 20:12:52 +08:00   ❤️ 2
    yaml 不适合写大的配置文件,层级到七八层以后,完全没法看。别问我怎么知道的,你试试手动写 k8s 的配置去。

    目前,让我选的话,我一定会选 toml,以接近 ini 的表达方式,提供了强大的结构表达能力
    jamesxu
        54
    jamesxu  
       2018-11-24 20:15:11 +08:00 via iPhone   ❤️ 3
    最烦这种靠缩进区分结构的语言
    zjsxwc
        55
    zjsxwc  
       2018-11-24 20:16:11 +08:00 via Android
    @wweir

    同感, 大一点的 yml 我恨不得来个游标卡尺量缩进
    br00k
        56
    br00k  
       2018-11-24 20:30:25 +08:00
    最近配置换成 yml,感觉可读性是不错。转换成 json 看的时候,感觉就是一堆括号。。。
    artandlol
        57
    artandlol  
       2018-11-24 20:35:26 +08:00 via iPhone
    k8s 就使用 yaml 作为配置文件,但遇到上万行的配置怎么办呢,aws 设计了一种专门的程序语言解决。具体什么语言忘了
    jimrok
        58
    jimrok  
       2018-11-24 20:44:02 +08:00
    1. 能写注释 2. 支持层级结构. 3. 支持多值(数组) 4. 可以引用。
    S9Yh4wIFsBG7jnE4
        59
    S9Yh4wIFsBG7jnE4  
       2018-11-24 21:35:00 +08:00
    @szq8014 你这主题为啥是绿的
    azh7138m
        60
    azh7138m  
       2018-11-24 21:53:19 +08:00 via Android
    @shayang888 要想生活过得去

    @sunmonster 配置文件要注释干啥。。。

    @beginor 多行文本为啥不行了 \n 是一个合法字符
    WispZhan
        61
    WispZhan  
       2018-11-24 22:10:04 +08:00 via Android
    @lihongjie0209 不考虑嵌入式设备?

    机器可读自然是考虑嵌入式系统可读,底层 C/Cpp 自然是更倾向二进制协议,自然有机器可读一说。

    这世界上还是嵌入式设备多得多,自然考虑机器可读。

    你们现在考虑的全是上位机,应用层。多考虑下其他场景
    WispZhan
        62
    WispZhan  
       2018-11-24 22:18:02 +08:00 via Android
    JSON 根本就不是作配置文件的料,楼上一堆说 JSON 配置的……连个注释都不是原生兼容的格式不配当配置。

    用 JSON 配置的一般都是 js 系的,其他的语言用真的不讨好。
    ---

    要吐槽 yaml 又想用 ini,那就看 toml 啰。

    ---

    最无聊的就是一群吐槽 xxx 不合理的,存在即使合理。别人有别人用的理由,你不爽就自己造轮子。

    ---

    还有楼主说的不兼容 tab ……你把 tab(/t)换 indent 好不,要挑起圣战么?
    beginor
        63
    beginor  
       2018-11-24 22:18:15 +08:00 via Android
    @azh7138m \n 还是只能写在一行内,你能写多行文本么?
    zhouzm
        64
    zhouzm  
       2018-11-24 22:42:43 +08:00
    我个人主力编辑器是 vim,觉得 yaml 非常适合手写,并且有很好的可读性。

    前面提到的 yaml 的问题主要集中在缩进,认为这样反面没有可读性。

    1. 现在 2 格缩进已经趋向于主流,在这种情况下,多层级缩进对文本的可视影响不是很大。
    2. terminal 环境下,vim 是主要的编辑器,vim 使用缩进对齐插件(例如 Yggdroot/indentLine),可以非常直观的看清楚数据的层级关系。
    3. vim 可以很方便的进行块缩进操作,这样如果需要进行块节点转移是极其方便的,相比之下,json 格式要做类似操作则很繁琐。

    以前我们的菜单是使用 json 格式保存,菜单项由于客户的要求,经常会进行重构,菜单项,菜单组经常会移来移去,手工编辑这个 json 非常痛苦,后来改成 yaml 格式后,再也没有这个烦恼,任他风雨来袭,我自岿然不动。
    参见示例图,图中只显示了 2 级菜单,实际运行中会出现 3 级、4 级:

    https://i.loli.net/2018/11/24/5bf95fb13cbda.png

    注意仔细看,yaml 格式并不是你们所想像的全是缩进哦。
    wspsxing
        65
    wspsxing  
       2018-11-24 23:03:17 +08:00   ❤️ 1
    ini, json, yaml, toml 都用过,
    ini 太原始,
    json 没有注释,ps,最后一个逗号好烦。
    yaml, 我因为缩进远离了 python,
    toml, 语法怪怪的, 可以写的 天外飞仙
    还有一些乱七八糟的格式就不说了

    最后感觉 json5 不错 , 支持注释, (数组,对象)最后一个逗号可选。。
    feverzsj
        66
    feverzsj  
       2018-11-24 23:24:55 +08:00
    因为对人而言方便,但是解析起来比 json 要复杂
    janxin
        67
    janxin  
       2018-11-24 23:33:14 +08:00 via iPad
    toml>yaml>>>json

    yaml 的好处是厉害久宣传的多库也全,又不像 json 这么可读性差。相对来说 toml 就是年轻了点
    zkeeper
        68
    zkeeper  
       2018-11-25 04:39:21 +08:00
    我觉得吧, 如果 json 能出个扩展, 支持注释, 就十分完美了.
    yaml 的问题是格式太容易出错, 不如 json 这么健壮, 毕竟空格缩进都是不可见的
    killerv
        69
    killerv  
       2018-11-25 06:30:10 +08:00
    感觉 ini 可读性没有那么好,没有层级概念
    MonoLogueChi
        70
    MonoLogueChi  
       2018-11-25 07:51:40 +08:00 via Android
    @gino86 单层级的话,yaml 和 INI 基本上是一样的啊,你说更省时间是从哪里得到的结论啊
    itskingname
        71
    itskingname  
       2018-11-25 07:56:01 +08:00 via iPhone   ❤️ 1
    @zkeeper json5
    yurun
        72
    yurun  
       2018-11-25 08:47:40 +08:00
    真的不喜欢 yaml
    mattx
        73
    mattx  
       2018-11-25 12:13:49 +08:00
    可视化方面, xml 感觉不错.
    BOYPT
        74
    BOYPT  
       2018-11-25 13:59:52 +08:00
    @0987363 #37 那是你 vim 使用不熟悉
    :paste 命令了解一下
    0987363
        75
    0987363  
       2018-11-25 15:20:54 +08:00 via Android
    @BOYPT 我说的是格式化后一坨屎。。并不只是复制粘贴的时候才格式化。。。
    AX5N
        76
    AX5N  
       2018-11-25 15:36:54 +08:00
    yaml > ini > json
    linxu
        77
    linxu  
       2018-11-26 19:56:41 +08:00 via Android
    @wly19960911 段之间可以继承
    szq8014
        78
    szq8014  
       2018-12-05 09:06:13 +08:00
    @shayang888 windows 个性化里面把颜色改了就行啊,这个颜色来自于一张壁纸
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:14 · PVG 11:14 · LAX 19:14 · JFK 22:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.