direnv 사용법: 설치, 셸 hook, .envrc로 프로젝트 환경 변수 자동 로드
cd 시 .envrc 로드, 나가면 해제. mise와 함께 쓰기 좋음.
mise or nvm pins Node, but you still hand-export DATABASE_URL or source .env in every repo tab. direnv loads project environment variables when you cd in and unloads when you leave. Config lives in .envrc; docs at direnv.net.
Searchers looking for install direnv envrc shell hook load environment variables need: install direnv, hook zsh/bash, author .envrc, run direnv allow, and split duties with mise. Steps follow the official docs.
direnv 대상
多项目、多套 env 的开发者
每个仓库有自己的 API 地址、PATH 前缀或 COMPOSE_FILE,不想把 export 写进全局 rc。
已用 mise / asdf 的团队
版本由 mise 管,非密钥类变量由 direnv 管;进目录两件事同时生效。
讨厌误用生产配置的人
离开项目目录变量被撤销,降低在错误目录跑迁移或脚本的风险(密钥仍不应提交 Git)。
direnv 설치
- 1
macOS:Homebrew
brew install direnv,运行direnv version确认 CLI 可用。 - 2
Linux 发行版
Arch:
sudo pacman -S direnv。Debian/Ubuntu 等可查apt install direnv是否提供当前版本;若无,按direnv.net的 binary 安装说明操作。 - 3
Nix / 其他
Nix 用户可用 nixpkgs 中的 direnv;无论渠道,装完都用
direnv version验证。 - 4
Windows
原生 Windows 支持有限;多数人在 WSL 或 Linux/macOS 终端里用 direnv。详见官方平台的安装页。
셸 hook
direnv 通过 shell hook 在每次提示符刷新前检查当前目录是否有已允许的 .envrc。把下面一行加入 rc 文件(以文档为准):
# zsh (~/.zshrc)
eval "$(direnv hook zsh)"
# bash (~/.bashrc)
eval "$(direnv hook bash)"
# fish (~/.config/fish/config.fish)
direnv hook fish | source保存后 source 该文件或重开终端。若 hook 未加载,cd 进含 .envrc 的目录不会出现 direnv 提示。
.envrc 와 allow
- 1
在仓库根创建 .envrc
示例(勿把真实密钥提交 Git):
# .envrc — 示例,本地值用 .envrc.local 或密钥管理器
export PROJECT_NAME="my-api"
export DATABASE_URL="postgres://localhost:5432/myapi_dev"
PATH_add ./bin
# 若已安装 mise,可在 .envrc 里加载 mise 环境(见 mise 文档)
# use mise- 2
首次 allow
进入目录时 direnv 会提示
direnv: error .envrc is blocked。阅读内容后运行direnv allow(仅在你信任该文件时)。 - 3
验证加载
cd离开再进入,或direnv reload。应看到direnv: export +N类提示;echo $DATABASE_URL在目录内有效,cd ..后变量被撤销。 - 4
团队与 .envrc.local
可提交不含密钥的
.envrc,在.gitignore里忽略.envrc.local,并在.envrc末尾source_env_if_exists .envrc.local(语法见官方 Standard library)。
| 命令 | 作用 | 何时用 |
|---|---|---|
direnv allow | 信任当前目录 .envrc | clone 后首次 |
direnv deny | 撤销信任 | 怀疑被篡改时 |
direnv reload | 重新加载 .envrc | 改文件后 |
direnv status | 查看是否 loaded / blocked | 排错 |
direnv 管的是当前 shell 的环境变量,不替代密钥保管(1Password、Vault、CI secrets)。生产连接串不要写进可提交的
.envrc。
和队友对齐本地 env 命名时,可从 wbroom 首页 开浏览器房间快速过一遍;版本 pin 可参考 mise 指南,容器栈见 Docker Compose 入门。
FAQ
Does direnv duplicate mise [env]?
可以分工:mise 的 [env] 适合与工具版本绑定的简单变量;direnv 适合复杂 PATH_add、source_env、多文件组合。同一变量只在一处定义,避免互相覆盖。
Not working in the IDE terminal?
确认 IDE 启动的 shell 加载了 direnv hook。部分 IDE 需从已 source rc 的终端启动,或使用 direnv 的 editor 集成说明。
Re-allow on every pull?
仅当 .envrc 内容哈希变化且 direnv 认为需要重新授权时。这是安全特性;改 .envrc 后按提示 direnv allow。
Can I use a dotenv file?
可在 .envrc 里用 dotenv_if_exists .env(stdlib)加载 .env,仍建议 .env 进 .gitignore,仓库只提交加载逻辑。