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"}
]
endDocumentation 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 configsFormalmente 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=basicbecomes%{"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=1becomes%{"VAR" => "1"} - expand is supported (for
HOME=~/nuxlli,USER_HOME=${HOME}becomes%{ "USER_HOME" => "~/nuxlli" })