View Source Jetenv in 5 minutes
Features
- Runtime configure from Environment
- Zero custom
runtime.exscoding - Explicit type conversion
- Address any Application environment node
- Fully automatic scan of Environment variables
Basics
- Common Env prefix:
je__(can be customized) - Separator is two successive underscores
__(equals a dot.) - Think of Application Env as a single root Keyword tree
Examples
A string config
Config:
config :my_app, :a_string_value, "this is a string"Jetenv:
export je__my_app__a_string_value__S="this is a string"Note, the prefix je__ and the type suffix __S
A value in the tree
Config
config :my_app, :group_of_options, [
option_bool: true,
sub_options: [
deeper_option_number: 14
]
]Jetenv
je__my_app__group_of_options__option_bool__B=true
je__my_app__group_of_options__sub_options__deeper_option_number__I=14A JSON value (maps/lists)
Note that as Config does not merge non-keyword nodes, nor does Jetenv.
Config
config :my_app, :map_data,
%{
a: 11,
b: 12
}Jetenv
je__my_app__map_data__J={"a": 11, "b": 12}Result
iex(2)> Jetenv.load_all_env
[my_app: [map_data: %{"a" => 11, "b" => 12}]]
iex(3)> Jetenv.load_all_env |> Application.put_all_env
:ok
iex(4)> Application.get_all_env :my_app
[map_data: %{"a" => 11, "b" => 12}]Jetenv.load_env will load config only for loaded Applications.
load_all_env will load anything found with the active prefix, this
will emit warnings on startup that configuration elements exist for
an unloaded application (which is why it's not the default behaviour).
These two are clearly not equivalent, but Jetenv can also handle erlang terms.
Erlang Term
sh% export je__my_app__config1__map__G='#{a => 1, b => 2}.'
sh% iex -S mix
iex(1)> Jetenv.load_all_env(prefix: "je")
[my_app: [config1: [map: %{a: 1, b: 2}]]]
iex(2)> Jetenv.load_all_env(prefix: "je") |> Application.put_all_env
:ok
iex(3)> Application.get_all_env :my_app
[config1: [map: %{a: 1, b: 2}]]Adding to a project
- No forklift required
- Use runtime_merge to cooperate with Config
For a new project
import Config
Jetenv.load_env()For an existing runtime.exs:
import Config
config :my_app .....
Jetenv.load_env() |> Jetenv.runtime_merge()QR Link
