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

问题描述 投票:0回答:2

我想做这样的事情:

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

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

yaml
2个回答
5
投票

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

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

foobar:
  <<: 
    - *foo
    - *bar

# foobar:
#   VAR1: value1
#   VAR2: value2

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

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

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

# foobar: 
#   VAR1: value1
#   bing: 
#     VAR2: value2
#     VAR3: value3

4
投票

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

但是,如果您正在处理映射,则可以使用 merge key language-independent type 如果您的解析器支持将多组键组合到新映射中:

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]

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

© www.soinside.com 2019 - 2024. All rights reserved.