direnv 实战:进目录自动切环境,Python 项目告别手动 source

玩自部署和本地 AI 的人,谁没被环境变量折…

玩自部署和本地 AI 的人,谁没被环境变量折磨过?同一台服务器上跑着三个 Python 项目,一个连 Ollama 的 API,一个写 PostgreSQL,还有一个要读对象存储的密钥。每次切项目,要么手动 source 一遍 venv,要么把一堆 export 塞进 .bashrc 让它们全局生效——前者烦,后者乱,还容易把密钥漏进 git。

今天推荐一个我用了两年、几乎零存在感但价值极高的工具:direnv。就一个词:省心。

direnv 是什么

direnv 是一个 shell 扩展。原理一句话:进入某个目录时,自动加载该目录下 .envrc 文件里定义的环境变量,离开时自动卸载。它不碰你的全局 shell 配置,每个项目的环境互相隔离,干净利落,也彻底告别了”这台机器上到底哪个项目的变量生效了”的困惑。

安装与配置

Ubuntu/Debian 直接 apt 装,macOS 用 brew,Arch 用 pacman,基本都有官方包:

sudo apt install direnv

装完关键一步——在 shell 配置里加 hook。用 Bash 的往 ~/.bashrc 末尾加一行:

eval "$(direnv hook bash)"

Zsh 用户把 bash 换成 zsh,Fish 换 fish。然后 source ~/.bashrc 让它生效。

基础用法

进到项目目录,创建一个 .envrc

echo 'export OPENAI_API_KEY="sk-xxxx"' > .envrc

第一次加载会报错并要求授权,这是它的安全机制。执行一次:

direnv allow

之后每次 cd 进这个目录,变量自动生效;cd 出去,变量自动清除。想反悔就用 direnv deny 撤销授权。

实战:自动激活 Python 虚拟环境

这才是 direnv 最香的地方。配合 venv 或 uv,进目录自动切环境,再也不用敲 source .venv/bin/activate

# .envrc
layout python-venv
export PROJECT_ENV="dev"

layout python-venv 会自动创建并激活 .venv 虚拟环境。如果你用 uv,直接一行 layout uv 更省事。也可以自己管 venv,只让它自动 source:

source .venv/bin/activate
unset PS1

第二行是防止 direnv 把命令提示符前缀搞乱,小细节但很实用。

管理 .env 密钥

很多项目有 .env 文件不想进 git。direnv 内置 dotenv 支持,在 .envrc 里写一行:

dotenv

它会自动读取同目录的 .env 并导出。这样 .env 留在本地、进 .gitignore,密钥不落地到仓库,比我以前手写 export 强太多。

另外几个我常用的 layout:layout nodenode_modules/.bin 加进 PATH,PATH_add bin 把子目录加进 PATH,layout go 自动设置 GOPATH。遇到就翻文档,基本够用。

安全提醒

最后必须强调:direnv allow 本质是授权执行 .envrc 里的任意 shell 代码。从别人仓库 clone 下来的 .envrc,先 cat 看一眼再 allow,别养成”进来就 allow”的肌肉记忆。这是它唯一的风险点,也是它刻意设计成需要手动授权的原因。

总结:direnv 装一次、配一次 hook,之后”环境切换”这件事就从你的待办清单里彻底消失。配合 .gitignore 和 dotenv,多项目隔离和密钥管理一并解决。自部署玩家,强烈建议现在就装。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注