Разделение файлов yaml и передача переменных - PullRequest
0 голосов
/ 30 августа 2018

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

Например:

Родительский файл yaml:

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

first.yaml file:

First:
  Properties:
   env: ${env}

1 Ответ

0 голосов
/ 30 августа 2018

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

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

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

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

   env: !v env

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

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

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

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

Но при передаче параметров возникнут некоторые проблемы:

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

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

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

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

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

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

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

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

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