J’en avais assez de taper source .env en entrant dans chaque projet. Et surtout d’oublier de le faire une fois sur trois, et de perdre 10 minutes à comprendre pourquoi la variable d’environnement n’était pas chargée.

direnv règle ça en un hook shell. Tu entres dans un dossier, il exécute .envrc. Tu en sors, il décharge tout. Plus rien à faire.

Mais ce qui change tout, c’est quand on le combine avec un password manager en CLI (pour ma part rbw) pour injecter les secrets automatiquement :

# .envrc — chargé automatiquement par direnv
export GITHUB_TOKEN=$(rbw get "Github - token API")
export AWS_ACCESS_KEY_ID=$(rbw get "AWS" --field username)
export AWS_SECRET_ACCESS_KEY=$(rbw get "AWS" --field password)

Chaque projet a ses secrets dans son .envrc. Aucun secret ne traîne dans un .env commité par erreur. Et rbw est déverrouillé une fois par session, le reste est transparent.

Le piège : direnv refuse d’exécuter un .envrc modifié sans direnv allow. C’est une sécurité. Mais les premières semaines, on oublie systématiquement et on fixe le prompt d’erreur sans comprendre.

Setup en 2 minutes

# Installation
sudo apt install direnv  # ou brew / cargo / go

# Hook shell (ajouter à .zshrc ou .bashrc)
eval "$(direnv hook zsh)"

# Dans un projet
echo 'export DATABASE_URL="postgresql://localhost/monprojet"' > .envrc
direnv allow  # une seule fois

Cheatsheet direnv

CommandeEffet
direnv allowAutorise le .envrc courant (après création ou modif)
direnv revokeRetire l’autorisation
direnv denyRefuse explicitement ce .envrc
direnv editOuvre .envrc dans $EDITOR
direnv exec . cmdExécute cmd avec l’environnement chargé (sans entrer dans le dossier)