vscode终端profile仅启动shell而不加载环境变量,项目级隔离需结合terminal.integrated.env.*与wrapper脚本实现;必须设inheritenv为false、cwd为${workspacefolder},并用exec $shell结尾确保终端持续运行。

VSCode 终端 Profile 本身不加载环境变量,只启动 shell;项目级环境隔离必须靠 terminal.integrated.env.* + 启动脚本组合实现,单靠 Profile 配置必然失败。
terminal.integrated.profiles.* 只负责启动 shell,不执行任何初始化逻辑
很多人在 settings.json 里写了 terminal.integrated.profiles.linux,以为配上 "command": "zsh" 就能自动加载 .envrc 或 venv/bin/activate —— 实际上它只是调用 zsh,连 ~/.zshrc 都不会读(因为是非登录、非交互模式)。
Profile 的作用仅限于:指定用哪个二进制启动终端、传什么初始参数、显示什么图标。它不 source 任何脚本,也不修改 PATH 或注入变量。
-
terminal.integrated.profiles.linux中的args字段支持传参,但 Windows PowerShell 下行为不一致,且无法写多行命令 - 想让
nvm use或pyenv local生效,不能指望 Profile 自己“感知项目”,必须显式触发 - Profile 设置会被工作区
.vscode/settings.json完全覆盖,全局配了也没用
真正起作用的是 terminal.integrated.env.* + wrapper 脚本
项目级环境变量注入和激活逻辑,必须拆成两部分:
1. 用 terminal.integrated.env.linux(或 .osx/.windows)注入静态变量,如 NODE_ENV、PYTHONPATH;
2. 用 terminal.integrated.shellArgs 指向一个项目根目录下的 wrapper 脚本(如 ./.vscode/activate.sh),由它完成动态激活。
- wrapper 脚本必须用
exec $SHELL结尾,否则终端启动后会退出 - 脚本里按需执行
direnv allow、nvm use、source venv/bin/activate,顺序很重要 - 不要在
~/.zshrc里根据$PWD判断路径——VSCode 终端启动时$PWD还没切到项目根目录,容易错判 -
terminal.integrated.cwd必须设为"${workspaceFolder}",否则脚本里的相对路径会失效
工作区 settings.json 是唯一可靠的作用域
所有终端相关配置必须写在项目根目录下的 .vscode/settings.json,而不是用户级设置。这是隔离生效的前提。
-
"terminal.integrated.defaultProfile.linux": "zsh"决定默认选哪个 shell,但只在当前工作区生效 -
"terminal.integrated.env.osx"和"terminal.integrated.shellArgs.osx"必须成对出现,缺一不可 - 如果用了
direnv,确保terminal.integrated.inheritEnv设为false,否则系统 PATH 会覆盖项目 PATH - Windows 用户注意:
shellArgs对powershell.exe传参需用-Command,且不支持&&链式执行,务必改用.ps1脚本封装
容易被忽略的关键点:inheritEnv 和 cwd 的协同
即使 wrapper 脚本正确执行了 source venv/bin/activate,如果 terminal.integrated.inheritEnv 是 true(默认值),VSCode 会把宿主机的 PATH 原样继承进来,导致虚拟环境的 bin/ 目录被压在后面,python 命令仍指向系统版本。
- 必须显式设
"terminal.integrated.inheritEnv": false,再靠 wrapper 脚本重建完整 PATH -
"terminal.integrated.cwd"不只是“打开终端在哪”,它决定了shellArgs中脚本的执行上下文,也影响direnv是否能识别.envrc - 如果项目结构是 monorepo,
cwd可设为"${workspaceFolder}/backend",但 wrapper 脚本路径要相应调整











