分离yaml文件并传递变量

时间:2018-08-30 01:04:48

标签: npm include yaml variable-subsitution

有什么方法可以分隔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 个答案:

答案 0 :(得分: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,变量”:{env:staging}

我认为那不是您想要的。 您应该将!Include的参数设为一个明确的序列:

  • !包括[/templates/first.yaml,变量:{env:staging}]

在这种情况下,参数的顺序很重要。或为每个参数使用映射:

  • !包括{文件:/templates/second.yaml,变量:{env:生产}}

如何真正实现所有这些取决于您的编程语言和所使用的解析器。