Tools

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.

Trang GitHub của direnv/direnv
Trang GitHub của direnv/direnv (ảnh chụp tháng 11/2026)

GitHub: https://github.com/direnv/direnv · khoảng 16 nghìn sao · Go · MIT

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àmTác dụng
dotenvNạp biến từ file .env trong thư mục
PATH_add binThêm ./bin vào đầu PATH (đúng đường dẫn tuyệt đối)
layout python3Tự tạo và kích hoạt virtualenv Python cho project
source_upNạp thêm .envrc của thư mục cha (dùng trong monorepo)
use nixNạ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 .envrc hiệ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ở .envrc bằ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 .envrc của repo lạ trước khi allow, 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 .zshrc vào .envrc tương ứng; không còn chạy nhầm database hay profile AWS của project khác.
  • Tech Lead: Commit một .envrc khô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

  1. direnv/direnv — direnv (GitHub)
  2. direnv documentation — direnv