direnv: tự nạp biến môi trường riêng cho từng project khi cd vào thư mục
Tóm tắt
direnv nạp biến từ .envrc khi bạn vào thư mục và gỡ khi rời đi, nên mỗi project có môi trường riêng. Gắn hook vào shell, direnv allow sau mỗi thay đổi, giữ secret trong file bị ignore.
Mỗi project cần biến môi trường riêng: DATABASE_URL, AWS_PROFILE, cổng chạy, đường dẫn tới công cụ trong ./bin. Hoặc bạn nhồi tất cả vào ~/.zshrc (lẫn lộn giữa các project, dễ chạy nhầm môi trường), hoặc phải nhớ source .env mỗi lần mở terminal. direnv giải quyết gọn: khi bạn cd vào thư mục có file .envrc, biến được nạp tự động; khi rời đi, biến được gỡ. Mỗi project có môi trường riêng, không đụng nhau.

Cài đặt và gắn vào shell
brew install direnv # macOS
sudo apt install direnv # Ubuntu/Debian
# Thêm vào CUỐI ~/.zshrc
eval "$(direnv hook zsh)"
# bash: eval "$(direnv hook bash)" fish: direnv hook fish | source
Bước gắn hook là bắt buộc; thiếu nó direnv không làm gì cả.
Dùng thử
cd ~/work/my-api
echo 'export DATABASE_URL=postgres://localhost/my_api_dev' > .envrc
# direnv: error .envrc is blocked. Run `direnv allow` to approve its content
direnv allow
# direnv: loading .envrc
# direnv: export +DATABASE_URL
echo $DATABASE_URL # có giá trị
cd ..
# direnv: unloading
echo $DATABASE_URL # rỗng
Cơ chế direnv allow là lớp bảo vệ: .envrc là mã shell, nên direnv chỉ chạy file bạn đã duyệt. Mỗi khi file thay đổi (ví dụ sau git pull), bạn phải allow lại.
Các hàm tiện ích trong .envrc
| Hàm | Tác dụng |
|---|---|
dotenv | Nạp biến từ file .env trong thư mục |
PATH_add bin | Thêm ./bin vào đầu PATH (đúng đường dẫn tuyệt đối) |
layout python3 | Tự tạo và kích hoạt virtualenv Python cho project |
source_up | Nạp thêm .envrc của thư mục cha (dùng trong monorepo) |
use nix | Nạp môi trường từ Nix, cho ai dùng Nix |
Mẫu .envrc thực tế
# .envrc (commit file này)
export AWS_PROFILE=myapp-dev
export PORT=3000
PATH_add node_modules/.bin
PATH_add scripts
dotenv_if_exists .env.local # bí mật để trong .env.local, KHÔNG commit
# .gitignore
.env.local
.direnv/
Lệnh hay dùng
direnv allow/direnv deny: cho phép / chặn.envrchiện tại.direnv reload: nạp lại sau khi sửa file mà không cần cd ra vào.direnv status: xem trạng thái, file nào đang được nạp.direnv edit .: mở.envrcbằng editor và tự allow khi lưu.
Lưu ý
- Không commit secret: tách giá trị nhạy cảm sang file bị ignore và nạp bằng
dotenv_if_exists. - Đọc nội dung
.envrccủa repo lạ trước khiallow, vì nó là mã chạy trên máy bạn. - Biến chỉ có trong shell; ứng dụng mở từ Dock hay IDE không đi qua shell sẽ không thấy, trừ khi IDE có plugin direnv.
- Nếu đã dùng mise, phần
[env]của mise làm được việc tương tự; chọn một công cụ để tránh chồng chéo.
Áp dụng thế nào?
- Dev: Chuyển biến của từng project ra khỏi
.zshrcvào.envrctương ứng; không còn chạy nhầm database hay profile AWS của project khác. - Tech Lead: Commit một
.envrckhông chứa bí mật, kèm.env.example; dev mới chỉ cần sao chép ví dụ vàdirenv allow. - PM: Giảm sự cố "chạy lệnh vào nhầm môi trường", loại lỗi có thể gây mất dữ liệu.
Nguồn & tham khảo
- direnv/direnv — direnv (GitHub)
- direnv documentation — direnv