在 vscode 扩展中订阅命令的目的?

Posted

技术标签:

【中文标题】在 vscode 扩展中订阅命令的目的?【英文标题】:Purpose for subscribing a command in vscode extension? 【发布时间】:2019-08-28 10:58:20 【问题描述】:

为什么 VSCode 扩展教程建议将注册的命令订阅到context.subscriptions

据我目前所知,这似乎没有必要或有用。

这是来自 VSCode 扩展 official tutorial 的 code snippet:

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 - 我是否应该订阅我的命令,为什么?

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

【问题讨论】:

【参考方案1】:

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

vscode.commands.registerCommand 返回一个一次性对象。处理返回的对象会取消注册命令,从而允许 VS Code 清理它可能拥有的任何内部状态/句柄。

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

【讨论】:

以上是关于在 vscode 扩展中订阅命令的目的?的主要内容,如果未能解决你的问题,请参考以下文章

可以从命令行调用 VSCode 扩展命令吗?

是否可以在 VSCode 中的扩展之间调用命令?

VSCode Prettier 扩展 vs 命令行 Prettier

如何在 VScode 中配置 Python 的交互式命令环境

vscode jest 扩展无法正常工作

如何以编程方式安装所有VSCode工作区扩展