说我有以下YAML文件:
-
key1: value
# and so on...
key99: value
key100:
subkey1: value
# and so on...
subkey100: value
-
key1: value
# and so on...
key99: value
key100:
subkey1: value
# and so on...
subkey100: SOME DIFFERENT VALUE
处理大量相同数据的自然方法是使用锚点,并覆盖更改的键。
问题是,这里的子键是不同的。是否有一种简单的方法可以引用key100['subkey100']
已更改?或者我是否必须在每个级别使用一系列锚点?
即,是否有简写:
- &anchor
key1: value
# and so on...
key99: value
key100: &subanchor
subkey1: value
# and so on...
subkey100: value
-
<<: *anchor
key100:
<<: *subanchor
subkey100: SOME DIFFERENT VALUE
答案 0 :(得分:8)
如果我正确理解了这个问题,我认为该规范不支持覆盖锚定节点的元素。
在阅读spec(版本1.2,但1.1说的相同)时,7.1 Alias Nodes部分(强调我的):
先前序列化的节点的后续出现将显示为别名节点。节点的第一次出现必须用锚标记,以允许后续出现作为别名节点。
别名节点由“*”指示符表示。别名是指具有相同锚点的最近的前一节点。别名节点使用先前未在文档中出现的锚点是错误的。指定任何别名节点未使用的锚点都不是错误。
请注意,别名节点不得指定任何属性或内容,因为这些属性或内容已在第一次出现时指定。
这里有两点:
“以前序列化的节点” - 此措辞表明别名旨在表示原始节点的另一个出现,而不仅仅是原始节点中的数据。换句话说,它代表相同的对象,而不是副本。
如果别名不能包含任何内容(第二个粗体部分),则无法以问题中建议的方式指定覆盖。
所以我对规范的解释是你不能按照规范这样做。
但是 - 如果您将示例(第二个代码块)从原始文件粘贴到this online tool(您可能要取消选中'规范'),该工具会按照问题中的预期解释它,复制原始内容但覆盖subkey100。与此YAML Lint Tool相同,this online parser也一样。
所以它似乎在实践中起作用,但我在规范中找不到对它的支持。
答案 1 :(得分:-1)
此功能已添加到yaml中,现在受支持https://confluence.atlassian.com/bitbucket/yaml-anchors-960154027.html