提供命令的 VS Code 扩展的标准执行流程

Posted

技术标签:

【中文标题】提供命令的 VS Code 扩展的标准执行流程【英文标题】:Standard flow of execution for a VS Code extension contributing a command 【发布时间】:2022-01-20 22:34:46 【问题描述】:

阅读官方文档以创建贡献命令的 VS Code 扩展(参见例如:Extension Entry File、VS Code Api - commands 等)给出的示例使用了这种模式:

    扩展在调用它应该定义的命令时被激活 它在那里定义了命令的代码(在其activate() 函数中)

为了更清楚起见,我在此处提供activate() 函数的示例代码:

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) 
  // Use the console to output diagnostic information (console.log) and errors (console.error)
  // This line of code will only be executed once when your extension is activated
  console.log('Congratulations, your extension "helloworld-sample" is now active!');

  // The command has been defined in the package.json file
  // Now provide the implementation of the command with registerCommand
  // The commandId parameter must match the command field in package.json
  let disposable = vscode.commands.registerCommand('helloworld.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);

现在,除了这不是我从仅仅“直观”的角度为扩展贡献命令所期望的模式(可能是“定义新命令的扩展应该在VS Code 的开始,以便它的命令从那里可用等”),我有几个问题,显然只是要求澄清,因为事情是这样工作的,甚至被呈现为“官方”:

如果扩展程序在其调用时定义了命令代码,如何运行(此处为“hello world”消息)?我假设 VS Code 在处理完所有来自扩展的 activate() 函数后会检查命令的处理程序; 在上述函数之前的注释中,声明扩展在第一次执行命令时被激活,但onCommand激活事件的文档实际上声明扩展在任何时候调用该命令;该声明也与我理解的模式相反,即在每次调用时“原子地”激活扩展/注册命令; 我假设这里的 disposable 取消注册命令,以便处理程序在每次调用时与命令新关联(文档对此并不清楚); 是这种整体模式(在调用命令时激活扩展,立即注册命令,然后停用扩展并取消注册命令)旨在改善内存消耗(例如,仅在定义命令时调用扩展而不是在 VS Code 的开头)或其他原因?

感谢您的澄清,如果我一开始没有正确理解该模式,我们深表歉意。

【问题讨论】:

【参考方案1】:

您是否阅读过package.json 文件,其中说明了何时应该激活扩展:activationEvents

在启动时,VSC 为package.json 中定义的每个扩展命令在命令表中放置一个 load_extension 函数句柄。

当您第一次调用命令时,会调用 load_extension 函数并加载扩展,并使用实际的命令函数句柄更新命令表。然后再次调用命令函数,现在使用正确的函数。

这是延迟激活扩展,如果您不使用此会话的扩展,则无需进行一些工作。

【讨论】:

是的,我已经阅读了激活事件页面(我还在我的帖子中链接了 onCommand 事件),但是您提供的其他详细信息从未在文档中提及或提及,并且可以t 由代码推断。我会将您的答案标记为正确答案,因为它更清楚地解释了内部工作原理,尽管有些点仍然模糊不清(例如在第一次加载后卸载扩展的时间,无论是在命令执行之后还是在关闭 VS Code 之后)。 @atava 一旦为此会话激活扩展,除非您禁用/卸载扩展,否则该扩展将保持本地存储在命令函数的关闭中。

以上是关于提供命令的 VS Code 扩展的标准执行流程的主要内容,如果未能解决你的问题,请参考以下文章

VS Code 命令托盘中的 Flutter 找不到 git

VS Code中Ionic serve命令 执行跳出的问题

VS Code中无法识别npm命令

vs.code调试node.js的C++扩展

VS Code UI语言不会传播到python扩展命令面板

vs code 安装Scala