必须先创建并保存 .code-workspace 文件:关闭所有文件夹→Ctrl+Shift+P→运行“Workspaces: Create Workspace”→多选项目根目录→保存为 xxx.code-workspace;路径推荐用环境变量(如 ${env:HOME}/project/frontend),调试配置需置于工作区 .vscode/launch.json 并通过 workspaceFolder:name 关联子项目。

多根工作区不是“拖几个文件夹进去就完事”,它必须通过 .code-workspace 文件显式定义,否则所有调试、搜索、设置行为都会降级为单根模式——你看到的只是多个文件夹平铺,不是真正的工作区。
怎么创建真正的多根工作区(而不是临时多文件夹)
VS Code 对“打开多个文件夹”和“启用多根工作区”的处理逻辑完全不同。直接拖拽或用 Add Folder to Workspace 往已打开的单文件夹窗口里加目录,只会生成临时上下文,关掉就丢,且 Ctrl+P 搜不到其他根目录下的文件。
- 正确起点:先关闭所有文件夹,确保 VS Code 是空窗口状态
- 执行命令面板:
Ctrl+Shift+P→ 输入Workspaces: Create Workspace→ 回车 - 在弹出对话框中按住
Ctrl(Windows/Linux)或Cmd(macOS)多选多个项目根目录 - 保存为
myapp.code-workspace—— 这一步不能跳,不保存就没有持久化配置
路径写相对还是绝对?.code-workspace 里 "path" 字段怎么填
填错路径会导致别人拉下代码后打不开工作区,报错 Unable to open workspace: path does not exist。关键不是“对不对”,而是“谁用、在哪用”。
- 绝对路径(如
"path": "/Users/me/project/backend")→ 本地能开,但团队协作基本不可用 - 纯相对路径(如
"path": "backend")→ 要求所有根目录都在同一父目录下,且必须从该父目录执行code myapp.code-workspace - 推荐方案:用环境变量,例如
"path": "${env:HOME}/dev/myapp/frontend"或"path": "${env:USERPROFILE}\dev\myapp\backend",兼顾可读性与跨平台基础兼容
launch.json 和 settings.json 放哪才生效
多根工作区里,VS Code 只认工作区级的 .vscode/launch.json 和 .code-workspace 中的 settings 字段。各子文件夹下的 .vscode/settings.json 默认被忽略,除非你在工作区配置里显式启用覆盖。
-
launch.json必须放在工作区根目录的.vscode/下,每个configuration要配"cwd": "${workspaceFolder:frontend}",其中frontend必须与.code-workspace中对应folders的name字段一致(没设name就默认取文件夹名) - 工作区级设置写在
.code-workspace的"settings"字段里,例如:"files.exclude": {"**/node_modules": true} - 想让某个子文件夹保留自己的设置(比如 Python 解释器路径),得在
.code-workspace中加"settings": { "python.defaultInterpreterPath": "./venv/bin/python" },并确保它作用于对应文件夹上下文
为什么改了设置却没生效?三层配置优先级怎么理解
设置冲突不是随机发生的,而是严格按层级覆盖:文件夹级 > 工作区级 > 用户级。但很多人误以为工作区设置能“一键覆盖全部”,其实它只影响明确声明的字段。
- 如果
frontend/.vscode/settings.json里有"eslint.enable": true,而.code-workspace里没写这一项,那前端文件夹仍会启用 ESLint - 工作区级设置无法静默压制文件夹级配置,必须显式写出相同 key 才能覆盖
- 扩展启用状态是全局的,但某些扩展(如 GitLens、ESLint)的行为会根据当前活动文件所在文件夹自动切换上下文,这容易造成“设置写了却像没起作用”的错觉
最容易被忽略的是:没有 .code-workspace 文件,就等于没启用多根工作区机制;所有看似“多项目”的操作,都只是 VS Code 在做妥协式兼容,不是真正的语义整合。











