【问题标题】:Override YAML subkey覆盖 YAML 子项
【发布时间】:2011-06-19 23:57:31
【问题描述】:

假设我有以下 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

【问题讨论】:

  • 这应该是一个简单的问题!普通人!
  • 对于 Google 员工:诀窍是您必须使用 &lt;&lt; 键。我刚刚在 docker-compose 文件中对此进行了测试,如果您使用 &lt;&lt; 键,那么它的行为就像您想要的那样。但是,您 不能 做的事情类似于 some_object: &amp;config ... other_object: &amp;config 并希望在那里覆盖。下面的规范似乎并没有禁止这样做,因为 &lt;&lt; 键显式地将数据从别名对象中提取出来,而如果您只是直接使用别名,则处于只读状态。希望这是有道理的。

标签: yaml


【解决方案1】:

如果我正确理解了这个问题,我认为规范不支持覆盖锚定节点的元素。

在阅读spec(1.2 版,但 1.1 也一样)时,7.1 Alias Nodes 部分指出(强调我的):

先前序列化的节点的后续出现将显示为别名节点。节点的第一次出现必须用锚标记,以允许后续出现的节点显示为别名节点。

别名节点由“*”指示符表示。别名是指具有相同锚点的最近的先前节点。别名节点使用文档中以前没有出现的锚是错误的。指定不被任何别名节点使用的锚点不是错误。

请注意,别名节点不得指定任何属性或内容,因为这些已在节点第一次出现时指定。

这里有两点:

  1. “以前序列化的节点”——这个措辞表明别名是为了代表原始节点的另一个出现,而不仅仅是原始节点中的数据。换句话说,它代表的是同一个对象,而不是副本。

  2. 如果别名不能有任何内容(第二个粗体部分),那么您不能以问题中建议的方式指定覆盖。

所以我对规范的解释是你不能按照规范去做。

但是 - 如果您将示例(第二个代码块)从原始内容粘贴到 this online tool(您可能想要取消选中“规范”),该工具会按照问题中的预期解释它,复制原始内容但覆盖 subkey100 .这个YAML Lint Toolthis online parser 一样。

所以它似乎在实践中有效,但我在规范中找不到对它的支持。

【讨论】:

  • 我认为&lt;&lt; 操作员正在制作一个深拷贝,然后可以就地修改
  • 我在 gitlab-ci-linter 中玩过锚点,看起来至少 gitlab-ci-linter 不能这样工作。修改不行,后面随便用。
猜你喜欢
  • 2014-05-31
  • 2012-05-08
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多