ConfigTuples provides a distillery's config provider that replace config tuples (e.g {:system, value}
) to their expected runtime value.
Documentation can be found at https://hexdocs.pm/config_tuples.
Add the package by adding config_tuples
to your list of dependencies in mix.exs
:
def deps do
[
{:config_tuples, "~> 0.2.0"}
]
end
Then, add it to the config providers of distillery in rel/config.exs
release :myapp do
# ...snip...
set config_providers: [
ConfigTuples.Provider
]
end
This will result in ConfigTuples.Provider
being invoked during boot, at which point it
will evaluate the current configuration for all the apps and replace the config tuples when needed, persisting it in the configuration.
The config tuple always start with :system
, and can have some options as keyword, the syntax are like this:
{:system, env_name}
{:system, env_name, opts}
The available options are:
type
: Type to cast the value, one of:string
,:integer
,:atom
,:boolean
. Default to:string
default
: Default value if the environment variable is not setted. Default nonil
transform
: Function to transform the final value, the syntax is {Module, :function}
If you need to store the literal values {:system, term()}
, {:system, term(), Keyword.t()}
,
you can use {:system, :literal, term()}
to disable ConfigTuples config interpolation. For example:
# This will store the value {:system, :foo}
config :my_app,
value: {:system, :literal, {:system, :foo}}
This could be an example for Ecto repository and logger:
config :my_app,
uri: {:system, "HOST", transform: {MyApp.UriParser, :parse}}
config :my_app, MyApp.Repo,
adapter: Ecto.Adapters.MySQL,
username: {:system, "DATABASE_USERNAME", default: "root"},
password: {:system, "DATABASE_PASSWORD", default: "toor"},
database: {:system, "DATABASE_DB", default: "myapp"},
hostname: {:system, "DATABASE_HOST", default: "localhost"},
port: {:system, "DATABASE_PORT", type: :integer, default: 3306},
pool_size: {:system, "DATABASE_POOL_SIZE", type: :integer, default: 10}
config :logger,
level: {:system, "LOG_LEVEL", type: :atom, default: :info}