打算在vscode扩展中订购命令?

时间:2019-04-06 22:31:06

标签: visual-studio-code vscode-extensions

为什么VSCode Extension教程为何建议向context.subscriptions订阅已注册的命令?

根据我到目前为止所讲的内容,这似乎没有必要或没有用。

这是VSCode扩展名code snippetofficial 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 Referencesubscriptions定义为:

  

订阅:{dispose} []

     

可以添加一次性用品的阵列。停用此扩展程序后,将丢弃一次性用品。

这是否意味着如果不处理已注册的命令,那么即使关闭扩展名,它们的侦听器也会以某种方式徘徊?

TDLR-我是否应该订阅命令,为什么?

任何解释或见解将不胜感激!

1 个答案:

答案 0 :(得分:3)

是的,您应该将命令添加到subscriptions。订阅可确保卸载扩展程序时正确注销命令。

vscode.commands.registerCommand返回一次性对象。处理返回的对象将取消注册该命令,从而使VS Code可以清理该命令可能具有的所有内部状态/句柄。

简而言之,扩展程序创建的所有一次性对象都应以某种方式进入subscriptions,以便在卸载扩展程序时可以正确清理它们。未能注册一次性使用品可能不会在99%的时间内给用户带来明显的问题,但是在用户启用和禁用您的扩展程序而无需重新启动vscode的情况下,可能会导致问题