多根工作区怎么处理?
结论
多根工作区是一个窗口里加了多个文件夹。不要假设 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}在多根下会歧义,执行前要让用户选文件夹,或跟随当前文件。