必须用 .code-workspace 文件实现稳定多根工作区:通过“workspaces: create workspace from folder”多选项目根目录创建,保存为相对路径,配置 settings、launch.json、tasks.json 到工作区级 .vscode 目录下,并规范使用 ${workspacefolder:name} 变量。

直接拖多个文件夹进 VS Code 窗口,只是临时多文件夹模式,关掉就丢配置、调试不认、扩展乱生效——真要稳定管多个项目,必须用 .code-workspace 文件。
怎么创建真正可复用的多根工作区
别靠“Add Folder to Workspace”临时拼凑,它不生成持久化文件。正确路径是先清空窗口(或新建空白窗口),再执行命令面板:Workspaces: Create Workspace from Folder,然后按住 Ctrl(Windows/Linux)或 Cmd(macOS)多选所有项目根目录,最后保存为 my-team.code-workspace。
生成的文件里 folders 字段必须是绝对路径或相对于该 .code-workspace 文件位置的相对路径;禁止嵌套路径(比如 ./backend 和 ./backend/src 同时存在),否则 VS Code 启动时报错 “folder is already in workspace”。
- 保存后双击该文件,或运行
code my-team.code-workspace,就能完整还原所有文件夹和设置 - 如果已有单文件夹打开状态,先执行
File > Save Workspace As…生成初始.code-workspace,再添加其他文件夹,否则后续操作可能失效 - 不要把
.code-workspace提交到公共仓库时硬写本地绝对路径;团队协作建议统一用相对路径 + 固定父目录结构(如所有项目都在~/workspace/下)
settings.json 到底该写在哪一层
VS Code 设置有三层:用户级(全局)、工作区级(.code-workspace 的 settings 字段)、文件夹级(各项目根下的 .vscode/settings.json)。优先级是:文件夹级 > 工作区级 > 用户级,但只对显式声明的字段生效。
- 想统一关闭所有项目的自动保存格式化?在
.code-workspace的settings里写"editor.formatOnSave": false - 但 backend 项目要用 Python 解释器,frontend 要用 TypeScript 类型导入策略?就得分别在各自
.vscode/settings.json里写"python.defaultInterpreterPath"和"typescript.preferences.importModuleSpecifier" - 工作区级
settings不继承注释、不保留缩进格式——手动编辑 JSON 后保存,所有注释都会被删,缩进强制变成 2 空格
launch.json 和 tasks.json 放哪儿才起作用
调试和任务配置不会跨文件夹自动查找。它们必须放在 .code-workspace 文件所在目录的 .vscode/ 子目录下(即同级目录),而不是某个项目文件夹里。
例如你有 my-team.code-workspace,那有效路径只能是 ./.vscode/launch.json,不能是 ./backend/.vscode/launch.json(除非你没用工作区机制)。
- 每个
configuration必须显式指定"cwd": "${workspaceFolder:backend}",其中backend要和.code-workspace中对应folders项的name字段一致;没设name就默认用文件夹名 - 终端默认工作目录始终是第一个
folders条目,想切到 backend?右键终端标签页 →Change Default Directory,或在launch.json里用${workspaceFolder:backend}显式传参 -
tasks.json同理:变量如${workspaceFolder:frontend}才能精准定位子项目脚本
切换工作区时,旧标签页还在,但已经失效了
VS Code 不会自动清理不属于当前工作区的打开文件。你在 a.code-workspace 里打开了 src/index.ts,切到 b.code-workspace 后,这个标签页还在,但 ESLint 规则、Git 状态、甚至断点都可能错乱或消失——因为上下文已脱离原工作区。
- 最稳妥做法:切换前按
Ctrl+K W关闭全部编辑器标签页 - 或者启用
"workbench.editor.closeOnFileDelete": true,避免误删文件后残留无效标签 - 别依赖“最近打开”或反复
Open Folder,那些只是临时会话,不是工作区,关掉就全丢
最容易被忽略的是调试和扩展上下文的断裂——比如你在 frontend 文件夹启用了 ESLint,切到 backend 工作区后,那个 ESLint 实例其实还在后台跑,但规则路径可能指向错误的 node_modules,导致报错不准确或静默失败。











