1

有没有办法分离 YAML 文件并将变量传递给子文件?

例如:

父 yaml 文件:

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

first.yaml文件:

First:
  Properties:
   env: ${env}
4

1 回答 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,变量”:{env:staging}

我不认为那是你想要的。您可能应该为!Include显式序列制作参数:

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

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

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

这一切应该如何实际实现取决于您的编程语言和您使用的解析器。

于 2018-08-30T04:25:32.910 回答