提供命令的 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 扩展的标准执行流程的主要内容,如果未能解决你的问题,请参考以下文章