Skip to content

Instantly share code, notes, and snippets.

@nuxlli
Last active February 5, 2019 18:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nuxlli/433c06b211a8112a4db31fb2d61b9eb6 to your computer and use it in GitHub Desktop.
Save nuxlli/433c06b211a8112a4db31fb2d61b9eb6 to your computer and use it in GitHub Desktop.

EnvTools

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 ;)

Installation

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.

Example

# 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

Regras

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" })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment