Как я могу сослаться на якорь YAML от другого якоря YAML? - PullRequest
1 голос
/ 10 октября 2019

У меня есть файл 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

Я ожидаю распространения значения.

1 Ответ

0 голосов
/ 11 октября 2019

Ошибка (она жалуется на первую строку с надписью "Hello World!"):

Вы должны сообщить нам, какую реализацию YAML вы используете. PyYAML и NimYAML оба правильно сообщают, что ошибка находится в третьей строке;вторая строка в порядке.

Я ожидаю, что значение будет распространяться.

В спецификации нет ничего, что поддерживало бы это ожидание. В спецификации указано: :

Обратите внимание, что узел псевдонима не должен указывать какие-либо свойства или содержимое, так как они уже были указаны при первом появлении узла.

Свойства являются якорями и тегами. Вы не можете поставить привязку к узлу псевдонима, так как он уже имеет привязку.

В вашем примере

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

&bar совершенно излишен, так как вы уже можете ссылаться на "Hello World" узел через *foo и, следовательно, нет смысла вводить &bar.

Чтобы ответить на ваш вопрос: Вы не можете ссылаться на якорь YAML от другого якоря YAML, потому что якорь YAML не является узлом. YAML представляет граф , то есть узлы и направленные ребра. Якоря и псевдонимы используются для ссылки на один и тот же узел несколько раз (а не для копирования значений, как вы могли бы подумать). Это также означает, что все содержимое файла YAML является содержимым. Не существует такой вещи, как объявления переменных.

Кажется, вы используете не тот инструмент для своего варианта использования. Чтобы настроить файлы YAML с внешними значениями, вы обычно используете шаблонизатор (например, SaltStack и Ansible используют Jinja) и генерируете файл YAML из шаблона. Вы можете указать свои параметры в другом файле YAML. Это четко отделяет параметры конфигурации от содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...