提供命令的 VS 代码扩展的标准执行流程
Standard flow of execution for a VS Code extension contributing a command
阅读用于创建贡献命令的 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
的文档激活事件实际上声明扩展被调用任何时候命令被调用;该声明也与我所理解的模式相反,即在每次调用时“原子地”激活 extension/registering 命令;
- 我假设
disposable
在这里注销了命令,因此处理程序在每次调用时都与命令重新关联(文档对此并不清楚);
- 这种整体模式(调用命令时激活扩展,立即注册命令,然后停用扩展并注销命令)是否旨在改善内存消耗(例如,仅在命令被调用时调用扩展)在 VS Code 的开头定义)或其他原因?
感谢您的澄清,如果我一开始没有正确理解该模式,我深表歉意。
您是否阅读了 package.json
文件,其中说明了何时应激活扩展:activationEvents
启动时,VSC 为 package.json
中定义的每个扩展命令在命令 table 中放置一个 load_extension 函数句柄。
当您第一次调用该命令时,将调用 load_extension 函数并加载扩展,并使用实际的命令函数句柄更新命令 table。再次调用命令函数,现在函数正确了。
这是懒惰的扩展激活,如果您不使用该扩展,则此会话无需任何工作。
阅读用于创建贡献命令的 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
的文档激活事件实际上声明扩展被调用任何时候命令被调用;该声明也与我所理解的模式相反,即在每次调用时“原子地”激活 extension/registering 命令; - 我假设
disposable
在这里注销了命令,因此处理程序在每次调用时都与命令重新关联(文档对此并不清楚); - 这种整体模式(调用命令时激活扩展,立即注册命令,然后停用扩展并注销命令)是否旨在改善内存消耗(例如,仅在命令被调用时调用扩展)在 VS Code 的开头定义)或其他原因?
感谢您的澄清,如果我一开始没有正确理解该模式,我深表歉意。
您是否阅读了 package.json
文件,其中说明了何时应激活扩展:activationEvents
启动时,VSC 为 package.json
中定义的每个扩展命令在命令 table 中放置一个 load_extension 函数句柄。
当您第一次调用该命令时,将调用 load_extension 函数并加载扩展,并使用实际的命令函数句柄更新命令 table。再次调用命令函数,现在函数正确了。
这是懒惰的扩展激活,如果您不使用该扩展,则此会话无需任何工作。