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
中的内容
方法论
感想
我们的数据很难真正属于我们自己,这是一个令人沮丧的事实