jsuth
jsuth

Reputation: 201

Can I concatenate aliases in YAML?

I would like to do something like:

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

This doesn't work directly. Is it possible to do something equivalent to this in YAML?

Upvotes: 7

Views: 9835

Answers (2)

Ryan Wheale
Ryan Wheale

Reputation: 28390

Unfortunately in 2022 you still cannot concatenate or join aliases with other aliases or strings. In addition to the accepted answer, there is another syntax which works the same but is easier to read IMO (this works in docker-compose btw):

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

foobar:
  <<: 
    - *foo
    - *bar

# foobar:
#   VAR1: value1
#   VAR2: value2

Also worth noting that you can nest anchors too:

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

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

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

Upvotes: 6

Anthon
Anthon

Reputation: 76598

No you cannot do that, an alias replaces a complete node.

However if you are dealing with mappings, you can use the merge key language-independent type if your parser supports it to combine multiple sets of keys into a new mapping:

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]

This however will make two entries each, and not concatenate the strings scalars that are anchored, and will need a program that can combine the multiple values, for which the ordering is not guaranteed.

Upvotes: 4

Related Questions