Mac 上为不同开发项目配置隔离环境变量的核心思路是按目录自动加载且不污染全局 shell,推荐用 direnv 实现目录级自动加载,配合 .env 文件与 dotenv 库实现语言层支持,终端内可用函数临时切换,GUI 应用需额外配置以同步环境。
mac 上为不同开发项目配置隔离的环境变量,核心思路是“按目录自动加载 + 不污染全局 shell”,而不是把所有变量塞进 ~/.zshrc。这样既能避免项目间冲突,又不用每次手动切换。
用 direnv 实现目录级自动加载
direnv 是 macOS 开发者最常用的环境变量自动管理工具,进入项目目录时自动加载对应变量,离开时自动清理,完全透明。
- 安装:
brew install direnv,然后在~/.zshrc末尾添加:eval "$(direnv hook zsh)",再执行source ~/.zshrc - 在项目根目录创建
.envrc文件,内容示例:
export NODE_ENV=development<br>export API_BASE_URL=https://api.dev.example.com<br>export DATABASE_URL=postgresql://localhost/myapp_dev
- 首次进入目录会提示
direnv: disallowed changes to the environment,运行direnv allow授权即可 - 终端提示符不会变,但
echo $API_BASE_URL已生效;新开一个终端进入其他项目,变量自动切换
配合 .env 文件 + dotenv 工具(语言层支持)
对 Node.js、Python 等项目,推荐用 .env 文件 + 对应语言的 dotenv 库,让代码自己读取变量,不依赖 shell。
- 在项目根目录放
.env(开发)和.env.production(生产),内容如:
DB_HOST=localhost<br>AUTH_SERVICE_URL=http://localhost:3001
- Node.js 中:安装
dotenv,在入口文件顶部加require('dotenv').config({ path: `.env.${process.env.NODE_ENV || 'development'}` }); - Python 中:用
python-dotenv,运行前加
from dotenv import load_dotenv<br>load_dotenv()
终端内临时切换(适合调试或快速验证)
不需要持久化时,直接定义函数写进 ~/.zshrc,新开终端就能用。
- 在
~/.zshrc里添加:
dev_env() { export NODE_ENV=development; export DB_HOST=localhost; echo "✅ 开发环境已激活" }<br>prod_env() { export NODE_ENV=production; export DB_HOST=prod-db.example.com; echo "✅ 生产环境已激活" } - 执行
source ~/.zshrc后,在任一终端输入dev_env或prod_env即可切换 - 注意:变量只对当前终端有效,关闭即失效,适合临时测试,不用于长期项目
GUI 应用(如 VS Code)也要同步环境
VS Code 默认不继承终端的 direnv 或函数变量,需额外处理:
- 推荐方式:用 VS Code 的「New Terminal (In Active Workspace)」右键菜单新建终端,它会自动加载项目目录下的
.envrc - 如果需要 GUI 启动时也带环境,可配合
launchd配置,但更简单的是在 VS Code 设置中启用:"terminal.integrated.env.osx": { "NODE_ENV": "development" }(仅静态值) - Python 用户:Cmd+Shift+P →「Python: Select Interpreter」→ 选中项目下
.venv内的 Python,它会自动读取同目录的.env(部分插件支持)

















