有没有办法分离 YAML 文件并将变量传递给子文件?
例如:
父 yaml 文件:
Fn::Merge:
- !Include /templates/first.yaml, variables: {env: staging}
- !Include /templates/second.yaml, variables: {env: production}
first.yaml
文件:
First:
Properties:
env: ${env}
有没有办法分离 YAML 文件并将变量传递给子文件?
例如:
父 yaml 文件:
Fn::Merge:
- !Include /templates/first.yaml, variables: {env: staging}
- !Include /templates/second.yaml, variables: {env: production}
first.yaml
文件:
First:
Properties:
env: ${env}
这不能在 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 相当于
我不认为那是你想要的。您可能应该为!Include
显式序列制作参数:
在这种情况下,参数的顺序很重要。或者对每个参数使用映射:
这一切应该如何实际实现取决于您的编程语言和您使用的解析器。