VSCode中“打开文件夹”与“打开.code-workspace文件”是两套独立配置体系:前者为隐式单根工作区,设置存于各文件夹的.vscode/settings.json;后者为显式多根工作区,配置集中于.code-workspace文件,优先级低于文件夹级设置。

直接说结论:VSCode 里“打开一个文件夹”和“打开一个 .code-workspace 文件”是两套完全不同的配置体系,不是程度深浅的区别,而是作用域、存储位置、生效逻辑都不同。
打开单个文件夹时,VSCode 实际在用“隐式工作区”
你双击进入 /projects/my-app,VSCode 确实也叫它“工作区”,但它没有显式的配置载体。所有设置(比如 editor.tabSize)默认写进该目录下的 .vscode/settings.json,也就是“文件夹级设置”。这种模式下:
- 无法定义跨多个物理路径的统一行为(比如同时约束前端+后端项目的
files.exclude) - 右键资源管理器里的文件夹 → “在文件夹中打开设置(JSON)” 打开的就是
.vscode/settings.json - 调试配置
launch.json、任务tasks.json都只能放在这个文件夹内,不能跨根复用 - 如果你没手动建
.vscode,那连项目级设置都没有,全靠用户设置兜底
.code-workspace 文件才是真正的多根工作区容器
它是个独立的 JSON 文件(如 my-team.code-workspace),不嵌套在任何项目目录里,通常放在团队共享路径或个人 workspace 目录下。关键点在于:
-
folders数组里写的每个path是相对或绝对路径,指向真实项目目录,VSCode 只读取不改动它们 -
settings字段写进去的内容,会覆盖所含所有文件夹的同名设置(例如统一设"emerald.editor.defaultFormatter": "esbenp.prettier-vscode") - 每个文件夹仍可保留自己的
.vscode/launch.json,互不影响;但工作区级设置对它们都生效 - 关闭窗口再打开
.code-workspace文件,VSCode 默认恢复上次打开的编辑器标签、终端会话——前提是"window.restoreWindows": "all"和"workbench.startupEditor": "none"这类设置已启用
settings.json 的优先级陷阱:文件夹 > 工作区 > 用户,但容易误判
很多人以为“工作区设置更高级”,其实不然。真正生效顺序是:文件夹级(.vscode/settings.json) > 工作区级(.code-workspace 中的 settings) > 用户级(全局 settings.json)。这意味着:
- 你在工作区设置里写了
"python.defaultInterpreterPath": "/usr/bin/python3",但某个文件夹自己在.vscode/settings.json里写了别的路径,那该文件夹就用自己写的 - 想让工作区设置“真正管住所有子目录”,就得确保各文件夹下没有冲突的
.vscode/settings.json,或者干脆删掉——否则你以为统一了,实际被悄悄覆盖 - VSCode 设置 UI 右上角切换“Workspace”时改的是
.code-workspace;切“Folder”时改的是对应文件夹的.vscode/settings.json,别点错位置
最常被忽略的一点:.code-workspace 文件本身不带任何逻辑,它只是个描述器;真正决定行为的是里面 folders 列表是否准确、settings 是否与各文件夹内配置形成合理覆盖关系。一旦路径写错、或某文件夹意外带了高优先级设置,整个工作区就“看似加载成功,实则部分失效”。


















