profile是唯一能实现插件进程级隔离的方案;vscode内置机制中仅profile可卸载extension host进程,其他方式如extensions.disabled仅禁用加载而无法终止已激活进程。

VSCode 插件市场本身不提供“多工作区隔离”功能,所有隔离能力都来自 VSCode 内置机制;真正能实现插件进程级隔离的,只有 Profile —— 其他方案(如 extensions.disabled、.vscode/settings.json)只能禁用加载,无法终止已激活的 Extension Host 进程。
Profile 是唯一能卸载插件进程的方案
VSCode 1.84+ 的 Profile 不是设置覆盖层,而是独立实例:每个 Profile 拥有自己的一套已安装扩展列表、启用状态、快捷键、代码片段和语言服务器进程。切换 Profile 后必须彻底关闭并重启窗口,否则旧插件(如 gitlens、pyright)仍在后台运行。
- 创建方式:命令面板输入
Profile: Create Profile,名称不能含空格(例如backend-go可行,backend go会失败) - 绑定项目:打开目标文件夹 → 左下角点击 Profile 名 →
Apply Profile to Folder - 首次应用后,需手动启用该 Profile 下所需插件(如
ms-python.python),已安装 ≠ 已启用 -
keybindings.json和snippets/自动隔离,但tasks.json和launch.json必须放在.vscode/目录下才生效
extensions.disabled 在 .vscode/settings.json 中只控制加载,不清理内存
extensions.disabled 写在工作区 .vscode/settings.json 里,确实能让插件不响应新文件,但它对已激活的 Extension Host 进程完全无效。常见错误是:点了 Disable (Workspace) → 看 UI 灰了 → 就以为完事了 —— 实际上 ps -p [pid] -o args= 仍能看到插件路径。
- 必须配合完整关窗(macOS 还要退出菜单栏图标)+
code .重开,才能让 Extension Host 以干净状态启动 - 该字段只接受插件 ID 字符串数组,例如:
"extensions.disabled": ["gitlens.gitlens", "esbenp.prettier-vscode"] - 别和
extensions.ignoreRecommendations混用,后者只影响推荐提示,不影响实际加载 - 某些插件(如
GitLens)会监听全局 fs 事件,即使被禁用,也可能因早期激活残留行为继续占资源
Multi-root workspace(.code-workspace)不能隔离插件,只隔离配置
.code-workspace 文件本质是多文件夹容器,它支持按文件夹写 settings、launch、tasks,但所有插件仍共用同一个 Extension Host 进程。你无法为 frontend/ 启用 Prettier 而同时为 backend/ 禁用它 —— 它们要么都加载,要么都靠 extensions.disabled 手动关,且关了也不退进程。
- 调试配置必须显式用
${workspaceFolder:backend}引用路径,不能写相对路径 -
folders数组中路径不能嵌套(如同时含"./api"和"./api/src"会报错) - 扩展推荐(
extensions.recommendations)可写入.code-workspace,但它只是提示,不强制禁用或卸载 - 若想真隔离,得为每个子项目单独建 Profile,并把
.code-workspace绑定到对应 Profile
Profile 切换后不重启窗口,等于没切;.vscode/settings.json 里写了 extensions.disabled 却没关窗重开,等于白写;.code-workspace 里塞了十个文件夹,只要有一个触发了 Python 插件,pyright 进程就一直挂着——这些不是 bug,是 VSCode 插件生命周期设计的硬约束。











