Ключ слияния является необязательным расширением устаревшего YAML 1.1. Давайте обсудим, что происходит в первом элементе:
- <<: *commonFields
SP c говорит:
Если значение, связанное с ключом слияния, является последовательностью, тогда эта последовательность ожидается, что они будут содержать узлы сопоставления, и каждый из этих узлов объединяется по очереди в соответствии с порядком в последовательности.
*commonFields
ссылается на последовательность, поэтому применимо следующее правило: мы объединяем каждое сопоставление в указанная последовательность в текущее отображение (текущее отображение - <<: *commonFields
). Объединение первой последовательности приводит к
- label: title
Затем мы объединяем второе отображение. Теперь применяется это правило:
Если значение, связанное с ключом, является одним узлом сопоставления, каждая из его пар ключ / значение вставляется в текущее сопоставление, , если ключ уже не существует в это.
В нашем сопоставлении уже есть ключ метка , поэтому пара ключ-значение label: url
из второго сопоставления не объединяется.
Вероятно, вы неправильно поняли, что делает <<
. Он объединяет отображения в отображение, которое является частью самого себя . Он не объединяет элементы последовательности в родительскую последовательность этого сопоставления. В стандартном YAML нет способа сделать это, и никакие расширения, о которых я знаю, не делают этого (даже <<
не является стандартным YAML).
Вы можете определить локальный тег для этого, например:
fields: !flatten
- *commonFields
- *metaFields
- *extraFields
Однако вам нужно будет самостоятельно реализовать тег !flatten
в коде, который загружает этот YAML.
В качестве альтернативы вы можете делать то, что делают все остальные, и использовать механизм шаблонов для предварительного обработать ваш YAML (Jinja2, Liquid и др. c).