开发者社区> 问答> 正文

是否存在用于共享列表或地图的一部分的YAML语法?

所以,我知道我可以做这样的事情:

sitelist: &sites - www.foo.com - www.bar.com

anotherlist: *sites 并且具有sitelist和anotherlist都包含www.foo.com和www.bar.com。不过,我真正想要的是anotherlist对还包含www.baz.com,而无需重复www.foo.com和www.baz.com。

这样做使我在YAML解析器中出现语法错误:

sitelist: &sites - www.foo.com - www.bar.com

anotherlist: *sites - www.baz.com 仅使用锚和别名似乎不可能在不添加另一级子结构的情况下完成我想要的事情,例如:

sitelist: &sites - www.foo.com - www.bar.com

anotherlist: - *sites - www.baz.com 这意味着此YAML文件的使用者必须了解它。

有没有做这种事情的纯YAML方法?还是我必须使用某些YAML后处理,例如实现变量替换或某些子结构的自动提升?我已经在进行这种后处理,以处理其他两个用例,因此我并不完全反对。但是我的YAML文件将由人类编写,而不是由机器生成,因此我想尽量减少用户在标准YAML语法基础上需要记住的规则数量。

我还想对地图做类似的事情:

namedsites: &sites Foo: www.foo.com Bar: www.bar.com

moresites: *sites Baz: www.baz.com 我已经通过YAML规范进行了搜索,但找不到任何内容,因此我怀疑答案只是“不,你不能这样做”。但是,如果有人有什么好主意。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 14:27:42 619 0
1 条回答
写回答
取消 提交回答
  • 合并键类型可能就是您想要的。它使用特殊的<<映射键来指示合并,从而允许将映射的别名(或此类别名的序列)用作初始化器,以合并到单个映射中。此外,您仍然可以显式覆盖值,或添加合并列表中不存在的值。

    重要的是要注意,它适用于映射,而不是序列的第一个示例。当您考虑它时,这是有道理的,并且您的示例似乎也不一定需要是连续的。只需将序列值更改为映射键即可解决问题,如以下(未经测试的)示例所示:

    sitelist: &sites ? www.foo.com # "www.foo.com" is the key, the value is null ? www.bar.com

    anotherlist: << : *sites # merge *sites into this mapping ? www.baz.com # add extra stuff 一些注意事项。首先,由于<<是密钥,因此每个节点只能指定一次。其次,当使用序列作为值时,顺序是重要的。在这里的示例中,这无关紧要,因为没有关联的值,但是值得注意。

    2020-02-08 14:27:58
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Terraform从入门到实践:快速构建你的第一张业务网络 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载