Direnv é uma ferramenta tão útil que fiquei impressionado em ter descoberto agora. O seu objetivo é a gestão de variáveis de ambiente por diretório e a gestão da variável de ambiente PATH.

De acordo com o The Twelve-Factor App, é uma boa prática que as configurações estejam como variáveis de ambiente. Alguns frameworks permitem que suas configurações sejam divididas por ambiente como o Rails e Phoenix, mas isso não é geral, especialmente para frameworks simples como PyBottle ou se usa bash scripts.

Como prefiro ferramentas agnósticas (que não seja ligado apenas à uma linguagem ou framework), o Direnv entra como uma ótima opção da configuração de ambiente de desenvolvimento.

No Mac, a sua instalação é simples:

$ brew install direnv 

O mesmo no Ubuntu/Debian:

$ sudo apt-get install direnv 

Depois disto, precisa adicionar a inicialização na configuração do Bash. Se usa Bash tradicional, só adicionar no ~/.bashrc

$ eval "$(direnv hook bash)"

Para outros bashes como Zsh, Fish, veja a documentação: http://direnv.net/

Variáveis de Ambiente

Basta criar um arquivo .envrc no diretório em que está o projeto com o conteúdo:

  FOO=value

Ao entrar e sair do diretório:

╭─crivelaro@me:~/
╰─λ cd project/
direnv: loading .envrc
direnv: export +FOO
╭─crivelaro@me:~/me
╰─λ cd ..
direnv: unloading

Assim, a variável de ambiente só fica disponível quando entro no diretório e dessa maneira posso usar a mesma variável para cada tipo de projeto o que é uma prática comum quando se usa projetos parecidos.

Adicionando diretórios ao PATH

Essa é a funcionalidade que mais gosto do Direnv. Quando monto alguns projetos com um diretório bin com alguns shell scripts, acho terrível ter que digitar algo como:

$ ./meu_script
$ bin/meu_script

No Linux ou Mac, um binário é chamado de acordo com os diretórios mapeados na variável de ambiente $PATH. O direnv pode configurar o PATH para que se tenha a configuração apenas para aquele projeto.

Para isso, mapeio o PATH para incluir a pasta de binários do projeto dentro do arquivo .envrc:

PATH_add ./bin

Pronto! Agora qualquer script executável pode ser chamado diretamente como qualquer software no Linux/Mac.

Quando saio do diretório, os binários não estão mais disponíveis pois o PATH voltou ao original.