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

Standard flow of execution for a VS Code extension contributing a command

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

  1. 扩展在调用它应该定义的命令时被激活
  2. 它在那里定义命令的代码(在它的 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 开始时激活,以便它的命令从那里可用等”),我有几个问题,这显然只是要求澄清,因为事情是这样工作的,甚至被呈现为“官方”:

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

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

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

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

这是懒惰的扩展激活,如果您不使用该扩展,则此会话无需任何工作。