Разделение файлов yaml и передача переменных

Есть ли способ отделить файл YAML и передать переменные в подфайлы?

Например:

Файл родительского ямля:

Fn::Merge:
  - !Include /templates/first.yaml, variables: {env: staging}
  - !Include /templates/second.yaml, variables: {env: production}

файл first.yaml:

First:
  Properties:
   env: ${env}
+1
источник поделиться
1 ответ

Это невозможно сделать в самом YAML, т.е. В спецификации нет ничего, что говорит о включении подфайлов или расширении переменной.

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

${env} выглядит как шаблон, который, как вы ожидаете, будет заменен при staging процессе загрузки. Однако из вашего примера неясно, всегда ли вы ожидаете, что полный скалярный узел будет заменен, или если это можно сделать с помощью среднего скаляра, и если да, то какой механизм эвакуации (т.е. как указать что-то во включенном файле, что приводит к строка ${env} в вашей программе).

Вы должны IMO явно пометить скаляры, которым требуется расширение шаблона. Вы можете сделать свой first.yaml пример.

   env: !v env

где интерпретация тега !v принимает полный скаляр. И если вы хотите расширение с помощью скаляров, вы используете другой тег и более подробный вариант шаблона, который вы использовали.

   xyz: !t This is a more verbose ${env} specficication

Вы можете подумать, что вам больше не нужно беспокоиться об экранировании, потому что, если нет тега, ${env} не интерпретируется, но это не так: вы все равно можете иметь скаляры, где некоторые шаблоны ${...} нуждаются в устном переводе, а другие нет.

У вашего тега !Include есть некоторые проблемы. Хорошо, что вы делаете вещи явным, используя тег. Некоторые программы, такие как Symfony, делают такое включение, магически интерпретируя специальные ключи и скалярный синтаксис (но это может быть результатом того, что нужно использовать довольно неполный парсер PHP YAML).

Но передача параметров будет приводить к следующим проблемам:

Включить /templates/first.yaml, переменные: {env: staging}

будет интерпретироваться так, как если бы вы написали один огромный ключ со встроенной запятой. Ваш YAML эквивалентен

  • Включить "/templates/first.yaml, variables": {env: staging}

И я не думаю, что это то, чего ты хочешь. Вы должны, вероятно, сделать параметр для !Include явную последовательность:

  • ! Включить [/templates/first.yaml, переменные: {env: staging}]

в этом случае порядок параметров важен. Или используйте сопоставления для каждого параметра:

  • ! Включить {файл: /templates/second.yaml, переменные: {env: production}}

Как это все должно быть реализовано на самом деле, зависит от вашего языка программирования и используемого вами парсера.

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос