VSCode 中的工作区实现

Workspace 保存了你在 VSCode 中工作中定义的配置信息

但是 VSCode 的 Workspace 在实现上有一些可能违反直觉的点

工作区的插件开关信息被存储在用户目录下的 AppData\Roaming\Code\User\workspaceStorage,该路径下的每一个子目录对应一个工作区

一个工作区对应一个窗口

[!info]- 文件夹、项目和目录
在本文中我混用了 文件夹项目目录 这三个名词,你不需要区分它们,因为他们在本文中的含义确实是相同的,你应该知道他们是什么意思

实验:文件夹和工作区的关系

用 VSCode 打开一个新窗口,然后用系统的资源管理器导航至 workspaceStorage 目录下,我们可以发现 VSCode 为我们新建了一个有较短的由纯数字构成的名字的目录,在我这里是 1710835214590

我们创建一个新项目 workspace_test,并在 VSCode 中打开该文件夹,发现 VSCode 为我们新建了一个有较长的由数字和小写字母混合的名字的目录,在我这里是 8ebf92b503dc18000e9034cb55a79129

[!猜测] 这里的 8ebf92b503dc18000e9034cb55a79129 看起来像是某种哈希值?

在打开的窗口中使某个插件在工作区可用,发现 VSCode 为我们修改了文件夹 8ebf92b503dc18000e9034cb55a79129

接下来我们关闭 VSCode,回到资源管理器下,可以发现目录 1710835214590 自动被清除了

再次打开 VSCode,之前关闭的内容又出现了,这次我们从这个窗口打开一个新窗口,发现 VSCode 创建了一个新目录 1710836187029

尝试从新窗口打开 workspace_test,我们回到原来的窗口

结论:文件夹和工作区的关系

在 VSCode 中,当我们打开一个没有任何文件夹的新窗口时,VSCode 会在用户目录的 AppData\Roaming\Code\User\workspaceStorage 路径下创建一个13位长的以纯数字命名的目录

当我们第一次打开一个文件夹时,VSCode 会自动为这个文件夹创建一个匿名工作区,该工作区的相关数据被存储在用户目录的 AppData\Roaming\Code\User\workspaceStorage 路径下的一个32位长以数字和小写字母混合命名的目录中,并将文件夹和该工作区关联

当我们在 VSCode 中打开一个我们之前已经打开过的文件夹时,VSCode 会打开该文件夹关联的工作区

[!问题]- 工作区查找机制
我并没有在这里探索

实验:多项目工作区、保存工作区

在这个实验项目的基础上,我们选择复制工作区,可以发现复制出的工作区并未保存原工作区插件的开关信息,而在资源管理器中看到出现新目录 58e7a03118d1c2a2a93f67ee5125638d,且新目录中的 json 文件内容指向用户文件夹下的AppData/Roaming/Code/Workspaces/1710837051534/workspace.json

关闭复制的工作区并且不保存,发现 AppData/Roaming/Code/Workspaces/1710837051534/workspace.json 被清除,但58e7a03118d1c2a2a93f67ee5125638d 被保留

再次复制工作区,出现新目录\9b42dd16e515b30b2964c635257ed403, 且新目录中的 json 文件内容指向用户文件夹下的 AppData/Roaming/Code/Workspaces/1710837918492/workspace.json

在工作区使能插件,这次我们将工作区保存为文件,然后再从文件中打开工作区,创建了新目录,但没有原来的插件使能信息

结论:VSCode 中的文件夹和工作区模型

VSCode 将工作区信息保存在用户目录下的 AppData\Roaming\Code\User\workspaceStorage 目录下,但这些目录并不是面向用户的

VSCode 会自动清除用户目录下 AppData/Roaming/Code/Workspaces 中的内容

方法论

感想

我们的数据很难真正属于我们自己,这是一个令人沮丧的事实