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
| Commande | Effet |
|---|---|
direnv allow | Autorise le .envrc courant (après création ou modif) |
direnv revoke | Retire l’autorisation |
direnv deny | Refuse explicitement ce .envrc |
direnv edit | Ouvre .envrc dans $EDITOR |
direnv exec . cmd | Exécute cmd avec l’environnement chargé (sans entrer dans le dossier) |