如何安装 direnv:.envrc 基础、项目目录 allow 与自动加载环境变量
安装 direnv,写 .envrc 并 allow,进出目录自动加载环境变量。
每个仓库都有自己的 API key、数据库 URL 和 PATH 补丁,却不想把 .env 手动 source 一遍。direnv 在项目目录里读 .envrc,你 cd 进去就加载环境变量,离开就卸载。本教程覆盖 macOS/Linux 安装、shell hook、.envrc 基础语法、在项目目录执行 direnv allow、以及自动加载与卸载,面向 hereink 读者常用的多仓库终端工作流。
检索词是如何安装 direnv 并写 .envrc 让项目环境变量自动加载。读完应能安装 direnv、写第一条 .envrc、在仓库根目录 direnv allow,并在进出目录时看到变量生效与消失。
direnv 解决什么问题
按目录隔离环境
全局 export 会污染所有 shell;只在当前项目需要的变量应随目录挂载。direnv 在 cd 时注入,cd .. 时撤销,减少「忘改 PATH 跑错脚本」。
与 .env 文件配合
.envrc 可以 dotenv 加载已有 .env,或直接用 export。密钥仍应进 .gitignore,只提交不含秘密的 .envrc 模板。
上游:
github.com/direnv/direnv,文档direnv.net。安装后运行direnv version确认。
安装 direnv
- 1macOS(Homebrew)
brew install direnv。验证:which direnv与direnv version。 - 2Linux(发行版包)
Debian/Ubuntu:
sudo apt update && sudo apt install direnv。Fedora:sudo dnf install direnv。Arch:sudo pacman -S direnv。 - 3挂到 shell(必做)
在
~/.zshrc或~/.bashrc末尾加:eval "$(direnv hook zsh)"(bash 用bash)。新开终端或source ~/.zshrc。 - 4fish
在
~/.config/fish/config.fish:direnv hook fish | source。见官方文档其他 shell。
.envrc 基础
.envrc 是 shell 脚本片段,放在项目根(或子目录)。常用写法:
# 直接 export
export API_BASE=https://api.staging.example.com
export NODE_ENV=development
# 把本地 bin prepend 到 PATH
PATH_add ./bin
# 加载同目录 .env(dotenv 需 direnv 标准库,见文档)
dotenv_if_exists不要把真实 token 提交到 git。团队可提交 .envrc 里的非敏感默认值,每人本地 .env 放密钥,由 dotenv_if_exists 读取。
在项目目录 allow
首次进入含 .envrc 的目录,direnv 会拒绝执行,直到你显式信任该文件:
cd ~/projects/my-app
# direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
direnv allow
# direnv: loading ~/projects/my-app/.envrc
echo $API_BASEdirenv allow 会在项目里写入哈希白名单(.direnv/),.envrc 内容变更后需再次 direnv allow。这是 deliberate 安全设计:任意 clone 的仓库不能静默改你的环境。
自动加载与离开卸载
hook 生效后,无需每次手动 source:
cd ~/projects/my-app # 加载 .envrc
env | grep API_BASE
cd ~ # 卸载该项目变量
env | grep API_BASE # 应无输出嵌套目录:子目录若有独立 .envrc,进入子目录会叠加或替换规则(见 direnv.net 的 source_up)。 monorepo 常在根目录统一 PATH_add 工具链。
与手动 source .env 对照
| 方式 | 何时加载 | 离开目录 |
|---|---|---|
source .env | 手动每次 | 变量仍留在 shell |
direnv + .envrc | cd 自动 | 自动卸载 |
| IDE 注入 | 打开项目 | 取决于 IDE |
- 适合
- 多仓库切换、Node/Python/Go 各要不同
PATH、staging/prod 端点按目录区分。 - 不适合
- 只想全局一次 export;或 CI 容器(在 Dockerfile/ workflow 里设 env 更直接)。
.envrc 改了为什么又不生效?
内容变更后运行 direnv allow 或 direnv reload。direnv 对比允许时的哈希,防止静默篡改。
和 asdf/mise 冲突吗?
可以并存:版本管理器在 shell 层,direnv 在目录层补 PATH 与项目变量。常见做法是在 .envrc 里 use mise 或调用工具提供的 direnv 集成(见各自文档)。
Windows 能用吗?
官方主要支持 Unix shell。WSL 内按 Linux 步骤安装 hook 即可。原生 PowerShell 支持有限,见 direnv 文档当前状态。
环境对齐后画一张图
终端里把 staging 端点与依赖服务理清后,架构仍适合摊在同一张白板上。见 如何创建空间。