跳到主要内容

多根工作区怎么处理?

结论​

多根工作区是一个窗口里加了多个文件夹。不要假设 workspaceFolders[0] 就是用户正在看的项目。路径、配置、任务都要落到具体那一个 WorkspaceFolder 上。

展开​

const folders = vscode.workspace.workspaceFolders;
const folder = vscode.workspace.getWorkspaceFolder(document.uri);

getWorkspaceFolder 能回答「这份文档属于哪个根」。编辑器命令应从当前文档或用户选中的资源管理器 URI 反推文件夹。

配置如果作用域是资源或文件夹,读取时传入文档 URI:

vscode.workspace.getConfiguration("myext", document.uri).get("enable");

不传 URI 时,多根下可能拿到工作区里另一层的值。

相对路径要先选定根再拼接,用 Uri.joinPath(folder.uri, "src/index.ts"),不要用字符串拼 folder.uri.fsPath + "/src"。

监听根的增减:workspace.onDidChangeWorkspaceFolders。缓存如果按「整个窗口一份」来做,根被移除后要删掉对应索引,否则会继续监视已经关掉的仓库。

没有文件夹的空窗口里,workspaceFolders 是 undefined,storageUri 也没有。插件要能在单文件模式下降级,而不是直接解构第 0 项。

容易讲错的点​

  • 多根不是「一个 git 仓库里的多个包」的同义词。一个文件夹内部的 monorepo 仍然是单根,只是你自己要再扫子项目。
  • 两个根里可能有同名相对路径,缓存键必须带文件夹 URI。
  • 任务和调试配置里的 ${workspaceFolder} 在多根下会歧义,执行前要让用户选文件夹,或跟随当前文件。