我有一个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
我希望值传播。
错误(它抱怨第一行上有“ Hello World!”):
您必须告诉我们您使用的是哪种YAML实现。 PyYAML和NimYAML都正确报告错误在第三行;第二行是可以的。
我希望值传播。
规范中没有任何东西支持这一期望。 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文件中提供选项。这将清楚地将配置选项与内容分开。