如何从另一个YAML锚引用YAML锚?

问题描述 投票:1回答:1

我有一个YAML文件,该文件具有多个我想为其提供相同值的键。另外,我希望此值易于配置。

请参见下面的YAML了解我的具体用例:

--- 
# Options for attribute_value
att_value_1: &att_value_1
att_value_2: &att_value_2
# There could be more options...

# This is where the constant is being set.
attribute_value: &attribute_value *att_value1

items:
  - name: item1
    attributes:
      attribute_for_item1: *attribute_value
  - name: item2
    attributes:
      attribute_for_item2: *attribute_value

这是演示问题的简化YAML:

--- 
foo: &foo "Hello World!"
bar: &bar *foo

错误(它抱怨第一行上有“ Hello World!”):

(<unknown>): did not find expected key while parsing a block mapping at line 2 column 1

我希望值传播。

yaml anchor
1个回答
0
投票

错误(它抱怨第一行上有“ Hello World!”):

您必须告诉我们您使用的是哪种YAML实现。 PyYAMLNimYAML都正确报告错误在第三行;第二行是可以的。

我希望值传播。

规范中没有任何东西支持这一期望。 The spec says

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

Properties是锚点和标签。您无法在别名节点上放置锚点,因为它已经具有锚点。

在您的示例中,

---
foo: &foo "Hello World!"
bar: &bar *foo

[&bar是完全多余的,因为您已经可以通过"Hello World"引用*foo节点,因此,引入&bar没有意义。

要回答您的问题:您不能从另一个YAML锚引用YAML锚,因为YAML锚不是节点。 YAML表示graph,即节点和有向边。锚点和别名用于多次引用同一节点(而不是像您想象的那样复制值)。这也意味着YAML文件中的所有内容都是内容。没有变量声明之类的东西。

似乎您在用例中使用了错误的工具。要使用外部值配置YAML文件,通常将使用模板引擎(例如,SaltStack和Ansible使用Jinja)并从模板生成YAML文件。您可以在另一个YAML文件中提供选项。这将清楚地将配置选项与内容分开。

© www.soinside.com 2019 - 2024. All rights reserved.