有什么方法可以分隔YAML文件并将变量传递给子文件?
例如:
父yaml文件:
Fn::Merge:
- !Include /templates/first.yaml, variables: {env: staging}
- !Include /templates/second.yaml, variables: {env: production}
first.yaml
文件:
First:
Properties:
env: ${env}
答案 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等于
我认为那不是您想要的。
您应该将!Include
的参数设为一个明确的序列:
在这种情况下,参数的顺序很重要。或为每个参数使用映射:
如何真正实现所有这些取决于您的编程语言和所使用的解析器。