YAML嵌套锚点如何工作?我的锚点配置为何验证失败?
YAML锚点使用错误修正与机制解析
错误原因
你的YAML报错核心有两点:
<<:是YAML映射(键值对集合)专属的合并操作符,只能在映射内部使用,但你在steps这个列表中使用了它,违反语法规则导致解析失败。- 锚点
&echo_baz定义为一个列表(包含单个run步骤),但steps列表的每个元素应为单个步骤(映射类型),结构匹配错误。
修正后的写法
写法一:锚点定义为单个步骤(最常用)
将锚点改为单个映射(对应单个步骤),直接作为steps的列表元素引用:
echo_baz: &echo_baz run: name: echo baz command: echo baz jobs: myjobs: steps: - mystep - run: name: echo foo command: echo foo - *echo_baz # 直接复用锚点的映射作为步骤 - run: name: echo bar command: echo bar
写法二:锚点定义为多步骤列表
如果需要复用一组步骤,可将锚点定义为列表,直接插入到steps列表中(主流YAML解析器均支持):
echo_baz_steps: &echo_baz_steps - run: name: echo baz command: echo baz - run: name: echo extra step command: echo extra jobs: myjobs: steps: - mystep - run: name: echo foo command: echo foo *echo_baz_steps # 将锚点列表的元素展开到当前steps中 - run: name: echo bar command: echo bar
YAML锚点工作机制
- 锚点标记:用
&锚点名标记任意类型的YAML节点(映射、列表、字符串等),相当于给节点起别名。 - 节点引用:用
*锚点名复用已标记的节点,解析时会直接替换为锚点指向的节点内容。 - 映射合并:
<<:仅用于映射内部,作用是将锚点映射中的键值对合并到当前映射,若存在重复键,当前映射的键会覆盖锚点的键:
解析后等价于:base_config: &base env: prod timeout: 300 job_config: <<: *base timeout: 600 # 覆盖base中的timeout字段job_config: env: prod timeout: 600 - 注意事项:列表中不能使用
<<:,复用列表内容直接用*锚点名即可;锚点引用的是节点的值,修改引用后的内容不会影响原锚点节点(多数解析器为值拷贝)。
内容的提问来源于stack exchange,提问作者Simon Ernesto Cardenas Zarate
相关产品推荐
相关产品推荐

