Exconfig
Context
Don't use ENV-settings for compile-time configuration. (Because it is hard to maintain your environment-settings for different deployments.
Imagine you want to build a Docker-image for your Phoenix-application and you use something like
plug SomePlug, config_value: System.get_env("SOME_KEY")
plug is a macro and therefore, SOME_KEY gets evaluated at
compile time. If SOME_KEY is customer-related, this setting
get's burned into the image and may surprisingly pop up at the
wrong customer's server.
The Exconfig-package will help you not to make this mistake.
Just use Exconfig.get instead of all your Application.get_env
and System.get_env calls. Because the cache-server of Exconfig
will not run at compile-time you'll get a compile-error if you
try to use System-envs from your busines-logic.
Usage
The application starts a GenServer and caches configuration at run time.
Loading configuration happens in two steps where each step overwrites eventually existing values from previous steps.
- Application.get_env(:app, :key) default
- System.get_env(:key) default
Once the value is cached it will be returned from the GenServer state rather than re-reading it from the environment again.
Using Exconfig.clear_cache!/0 will drop the cache and values will be
loaded again if being accessed later.
Example:
iex> value = Exconfig.get(:my_app, :foo, "bar" )
"bar"
iex> value = Exconfig.get(:env, :some_secret )
nil
Exconfig.get/3 will first lookup for :myapp/:foo in the Exconfig.Cache
(a GenServer) and if not found load from Application, System, or
returns the default. The second example will read from env-var SOME_SECRET.
Because no default value is given, it will return nil
configuration.log
Exconfig.get/3 is a macro. At compile-time in any environment but :prod,
it will capture it's usage in a file. The file can be configured in config.ex
and defaults to configuration.log.
The File can be used as a template for a shell-script.
Installation
Available in Hex. The package can be installed
by adding Exconfig to your list of dependencies in mix.exs:
def deps do
[
{:exconfig, "~> 0.2.0"}
]
end
Documentation can be generated with mix docs (ExDoc)
and is published at https://hexdocs.pm/exconfig.