我可以在 YAML 中连接别名吗?

use*_*593 7 yaml

我想做这样的事情:

opt-flags   : &opt_flags -DCMAKE_BUILD_TYPE=Release
dbg-flags   : &dbg_flags -DCMAKE_BUILD_TYPE=Debug
common-flags: &common    -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON 

# concatenate previous definitions to create composed definitions
dbg: *common *dbg_flags   
opt: *common *opt_flags
Run Code Online (Sandbox Code Playgroud)

这不能直接起作用。是否可以在 YAML 中执行与此等效的操作?

Rya*_*ale 5

不幸的是,到 2022 年,您仍然无法将别名与其他别名或字符串串联或连接。除了已接受的答案之外,还有另一种语法,其工作原理相同但更易于阅读(IMO)(这适用于 docker-compose 顺便说一句):

x-foo: &foo
  VAR1: value1
x-bar: &bar
  VAR2: value2

foobar:
  <<: 
    - *foo
    - *bar

# foobar:
#   VAR1: value1
#   VAR2: value2
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是,您也可以嵌套锚点:

x-foo: &foo
  VAR1: value1
  bar: &bar
    VAR2: value2

foobar:
  <<: *foo
  bing:
    <<: *bar
    VAR3: value3

# foobar: 
#   VAR1: value1
#   bing: 
#     VAR2: value2
#     VAR3: value3
Run Code Online (Sandbox Code Playgroud)


Ant*_*hon 4

不,你不能这样做,别名会取代完整的节点。

但是,如果您正在处理映射,如果您的解析器支持将多组键组合成一个新映射,则可以使用与语言无关的合并键类型:

opt-flags   : &opt_flags -DCMAKE_BUILD_TYPE=Release
dbg-flags   : &dbg_flags -DCMAKE_BUILD_TYPE=Debug
common-flags: &common    -DENABLE_EXAMPLES=ON -DENABLE_TESTS=ON 

dbg:
  << : [*common_flags, *dbg_flags]
opt:
  << : [*common_flags, *opt_flags]
Run Code Online (Sandbox Code Playgroud)

然而,这将分别生成两个条目,并且不会连接锚定的字符串标量,并且需要一个可以组合多个值的程序,而不能保证顺序