The configuration is represented by a map. the map is constructed by aggregating variables from multiple sources in the environment. The default sources include EDN configuration and shell variables.
The library will first look for a config.edn
file on the resource path. This will be used as the base configuration for the application. An external configuration file can be specified using the conf
environment variable at runtime, e.g: export CONF="prod-config.edn"
.
The configuration placed in the configuration file should consist of a map such as the following:
{:port 4000
:host "127.0.0.1"}
This configuration will be merged on top of the configuration found in the environment. The library uses a deep merge strategy, so any nested structures will be merged intelligently.
Environment variable names are converted into Clojure style keywords. These variables are parsed using the following strategy:
PORT=3000
-> {:port 3000}
NREPL_PORT=7000
- {:nrepl-port 7000}
DATABASE_URL="jdbc:h2:./guestbook_dev.db"
-> {:database-url "jdbc:h2:./guestbook_dev.db"}
IO__HTTP_MAX_CONNECTIONS="{:value 10}"
-> {:io {:http-max-connections {:value 10}}}
Note that the _
is converted to -
, while __
is used to indicate nesting for shell variables. These conventions can be mixed as seen with IO__HTTP_MAX_CONNECTIONS
.
The library will attempt to parse variables in the following order:
The environment configuration will be read as the default.
Next, the library will look for the conf
environment variable. When present, it will attempt to read configuration from the file pointed to by this variable.
When the conf
environment variable is not present, the library will look for a file called config.edn
at the location where the app was run.
When a configuration file is found, it will be deep merged on top of the configuration read from the envrionment.