为什么VSCode扩展教程建议订阅注册命令到context.subscriptions
?
到目前为止,它似乎没有必要或有用。
这是来自VSCode扩展code snippet的official tutorial:
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
// The code you place here will be executed every time your command is executed
// Display a message box to the user
vscode.window.showInformationMessage('Hello World!');
});
context.subscriptions.push(disposable);
但这本身似乎工作得很好:
vscode.commands.registerCommand('extension.helloWorld', () => {
vscode.window.showInformationMessage('Hello World!');
});
此外,我尝试禁用已执行但未将其注册命令添加到context.subscriptions
的扩展 - 在两种情况下禁用后命令都不可用。
VS Code Api Reference将subscriptions
定义为:
订阅:{dispose} []
可以添加一次性物品的阵列。当该延伸部分停用时,将丢弃一次性物品。
这是否意味着如果未处理已注册的命令,那么即使在扩展关闭后,他们的听众也会以某种方式徘徊?
TDLR - 我应该订阅我的命令,为什么?
任何解释或见解将不胜感激!
是的,您应该将命令添加到subscriptions
。订阅可确保在卸载扩展时正确取消注册命令。
vscode.commands.registerCommand
返回一个一次性物体。处理返回的对象会取消注册该命令,从而允许VS代码清除它可能具有的任何内部状态/句柄。
简而言之,您的扩展程序创建的所有一次性对象应以某种方式进入subscriptions
,以便在卸载扩展时可以正确清理它们。未注册一次性用户可能不会在99%的情况下对用户造成明显问题,但在用户启用和禁用扩展程序而不重新启动vscode的情况下可能会导致问题