| [](https://github.com/dart-lang/tools/actions/workflows/cli_config.yml) | |
| [](https://coveralls.io/github/dart-lang/tools?branch=main) | |
| [](https://pub.dev/packages/cli_config) | |
| [](https://pub.dev/packages/cli_config/publisher) | |
| A library to take config values from configuration files, CLI arguments, and | |
| environment variables. | |
| ## Usage | |
| Configuration can be provided from commandline arguments, environment variables, | |
| and configuration files. This library makes these accessible via a uniform API. | |
| Configuration can be provided via the three sources as follows: | |
| 1. commandline argument defines as `-Dsome_key=some_value`, | |
| 2. environment variables as `SOME_KEY=some_value`, and | |
| 3. config files as JSON or YAML as `{'some_key': 'some_value'}`. | |
| The default lookup behavior is that commandline argument defines take precedence | |
| over environment variables, which take precedence over the configuration file. | |
| If a single value is requested from this configuration, the first source that | |
| can provide the value will provide it. For example | |
| `config.string('some_key')` with `{'some_key': 'file_value'}` in the config file | |
| and `-Dsome_key=cli_value` as commandline argument returns | |
| `'cli_value'`. The implication is that you can not remove keys from the | |
| configuration file, only overwrite or append them. | |
| If a list value is requested from this configuration, the values provided by the | |
| various sources can be combined or not. For example | |
| `config.optionalStringList('some_key', combineAllConfigs: true)` returns | |
| `['cli_value', 'file_value']`. | |
| The config is hierarchical in nature, using `.` as the hierarchy separator for | |
| lookup and commandline defines. The hierarchy should be materialized in the JSON | |
| or YAML configuration file. For environment variables `__` is used as hierarchy | |
| separator. | |
| Hierarchical configuration can be provided via the three sources as follows: | |
| 1. commandline argument defines as `-Dsome_key.some_nested_key=some_value`, | |
| 2. environment variables as `SOME_KEY__SOME_NESTED_KEY=some_value`, and | |
| 3. config files as JSON or YAML as | |
| ```yaml | |
| some_key: | |
| some_nested_key: | |
| some_value | |
| ``` | |
| The config is opinionated on the format of the keys in the sources. | |
| * Command-line argument keys should be lower-cased alphanumeric | |
| characters or underscores, with `.` for hierarchy. | |
| * Environment variables keys should be upper-cased alphanumeric | |
| characters or underscores, with `__` for hierarchy. | |
| * Config files keys should be lower-cased alphanumeric | |
| characters or underscores. | |
| In the API they are made available lower-cased and with underscores, and | |
| `.` as hierarchy separator. | |
| ## Example usage | |
| This example creates a configuration which first looks for command-line defines | |
| in the `arguments` list then looks in `Platform.environment`, then looks in any | |
| local configuration file. | |
| ```dart | |
| final config = await Config.fromArguments(arguments: arguments); | |
| final pathValue = | |
| config.optionalPath('my_path', resolveUri: true, mustExist: false); | |
| print(pathValue?.toFilePath()); | |
| ``` |