Skip to main content
Version: 1.1

Selecting multiple configs from a Config Group

ย Example

Problem#

In some scenarios, one may need to select multiple configs from the same Config Group.

Solution#

Use a list of config names as the value of the config group in the Defaults List or in the command line.

Example#

In this example, we configure a server. The server can host multiple websites at the same time.

Config directory
โ”œโ”€โ”€ config.yamlโ””โ”€โ”€ server    โ”œโ”€โ”€ apache.yaml    โ””โ”€โ”€ site        โ”œโ”€โ”€ amazon.yaml        โ”œโ”€โ”€ fb.yaml        โ””โ”€โ”€ google.yaml
config.yaml
defaults:  - server/apache




server/apache.yaml
defaults:  - site:    - fb    - google
host: localhostport: 443
server/site/amazon.yaml
amazon:  domain: amazon.com
server/site/fb.yaml
fb:  domain: facebook.com
server/site/google.yaml
google:  domain: google.com

Output:

$ python my_app.py
server:  site:    fb:      domain: facebook.com    google:      domain: google.com  host: localhost  port: 443

Override the selected sites from the command line by passing a list. e.g:

$ python my_app.py 'server/site=[google,amazon]'
server:  site:    google:      domain: google.com    amazon:      domain: amazon.com  host: localhost  port: 443

Overriding packages#

You can relocate the package of all the configs in the list. e.g:

server/apache.yaml
defaults:  - [email protected]:    - fb    - google

$ python my_app.py
server:  https:    fb:      domain: facebook.com    google:      domain: google.com

When overriding the selected configs of config groups with overridden packages you need to use the package. e.g:

$ python my_app.py server/[email protected]=amazon
server:  https:    amazon:      domain: amazon.com  host: localhost  port: 443

Implementation considerations#

A nested list in the Defaults List is interpreted as a list of non-overridable configs:

server/apache.yaml
defaults:  - site:    - fb    - google
Equivalent to
defaults:  - site/fb  - site/google

All default package for all the configs in server/site is server.site. This example uses an explicit nesting level inside each of the website configs to prevent them stepping over one another:

server/site/amazon.yaml
amazon:  ...