Atenção: Este projeto não é uma ferramenta de configuração com base em variáveis de ambiente para Elixir por si só. Em geral este não é o caminho para configuração de aplicações Elixir.
Este projeto reuni algumas ferramentas uteis para lidar com variáveis de ambiente:
- Um suporte a carregamento e parse de arquivos dotenv:
EnvTools.load!
- Um parse para formatos dotenv:
EnvTools.decode!
- Um transformador de tipos para variáveis de ambiente:
EnvTools.get!
Você pode combinar essa ferramenta com Mix Config Provider, e obter um suporte a configuração através de variáveis de ambiente relativamente elegante.
Desenvolvedor k8s: Em minha experiência fazendo o deploy de aplicações Elixir para k8s esse conjunto de ferramentas se mostrou bem útil ;)
If available in Hex, the package can be installed
by adding env_tools
to your list of dependencies in mix.exs
:
def deps do
[
{:env_tools, "~> 0.1.0"}
]
end
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/env_tools.
# config/config.exs
if !Code.ensure_loaded?(EnvTools) do
# Load before `mix compile`
env_tools = "deps/env_tools/lib/env_tools.ex"
if File.exists?(env_tools) do
Code.eval_file(env_tools)
else
# Fallback before `mix deps.get`
defmodule EnvTools do
def load(_), do: nil
def get(opts), do: opts
end
end
end
EnvTools.load(["#{__DIR__}/../envs", __DIR__])
use Mix.Config
config :my_app,
param: EnvTools.get({:interger, "VAR_PARAM", 0})
# other configs
Formalmente o dotenv não é um formato padronizado. Mas muitos outros projetos tem usado o projeto npm como base para implementação de seus parsers.
Assim como dotenv, esse projeto segue a seguintes regras:
BASIC=basic
becomes%{"BASIC" => "basic"}
- empty lines are skipped
- lines beginning with # are treated as comments
- empty values become empty strings (
EMPTY=
becomes${"EMPTY" => ""}
) - single and double quoted values are escaped (
SINGLE_QUOTE='quoted'
becomes%{"SINGLE_QUOTE" => "quoted"}
) - new lines are expanded if in double quotes: (
MULTILINE="new\nline"
becomes:%{"MULTILINE" => "new\nline"}
) - inner quotes are maintained (think JSON) (
JSON={"foo": "bar"}
becomes%{"JSON" => "{\"foo\": \"bar\"}"}
) - whitespace is removed from both ends of the value (see more on trim) (
FOO=" some value "
becomes%{"FOO" => "some value"}
)
Regras adicionais:
- export is supported (
export VAR=1
becomes%{"VAR" => "1"}
- expand is supported (for
HOME=~/nuxlli
,USER_HOME=${HOME}
becomes%{ "USER_HOME" => "~/nuxlli" }
)