如何在VSCode扩展卸载或更新时清除settings.json中的对应配置
问题根因
- 你调用的
update方法是异步API,返回Promise对象,原代码没有将这个Promise作为deactivate的返回值,VSCode不会等待异步操作执行完成就会销毁扩展进程,导致配置修改操作被中断。 - 默认扩展卸载时不会触发
deactivate生命周期函数,需要额外添加配置声明才会在卸载时执行清理逻辑。
修复步骤
1. 改写deactivate函数,返回异步操作结果
如果只需要删除单个配置项,修改为如下代码:
export function deactivate(): Thenable<void> | undefined { return vscode.workspace.getConfiguration("mysection").update( "mykey", undefined, vscode.ConfigurationTarget.Global ); }
如果需要清理该扩展名下所有写入的全局配置,可以批量遍历删除:
export function deactivate(): Thenable<void[]> | undefined { const extConfig = vscode.workspace.getConfiguration("mysection"); // 筛选出所有用户手动修改过、属于当前扩展的全局配置项 const customGlobalKeys = Object.keys(extConfig).filter(key => { return extConfig.inspect(key)?.globalValue !== undefined; }); // 批量执行删除,返回所有异步操作的Promise集合 return Promise.all( customGlobalKeys.map(key => extConfig.update(key, undefined, vscode.ConfigurationTarget.Global)) ); }
注意:如果你的扩展还会写入工作区、工作区文件夹级别的配置,需要对应添加
ConfigurationTarget.Workspace、ConfigurationTarget.WorkspaceFolder级别的清理逻辑。
2. 配置package.json支持卸载触发清理
在扩展的package.json根层级添加以下配置,开启卸载钩子能力:
{ "name": "你的扩展id", "version": "你的版本号", // 新增以下配置 "capabilities": { "uninstall": true } }
配置完成后,VSCode会在扩展卸载时主动执行deactivate函数,并且等待你返回的Promise执行完成后再完成卸载流程。
扩展更新场景不需要额外配置,更新前旧版本的deactivate会自动触发。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

