vscode插件开发中文文档教程(3)——扩展结构
原文链接:Extension Anatomy
作者:Microsoft
译者:倔强青铜三
前言
大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
扩展结构
在上一个主题中,您已经能够运行一个基本的扩展。它是如何在底层工作的呢?
Hello World
扩展完成了以下三件事:
注册了
onCommand
激活事件:onCommand:helloworld.helloWorld
,因此当用户运行Hello World
命令时,扩展会被激活。注意: 从 VS Code 1.74.0 开始,在
package.json
的commands
部分中声明的命令在被调用时会自动激活扩展,而无需在activationEvents
中显式添加onCommand
条目。- 使用
contributes.commands
贡献点,使命令Hello World
在命令面板中可用,并将其绑定到命令 IDhelloworld.helloWorld
。 - 使用
commands.registerCommand
VS Code API,将一个函数绑定到已注册的命令 IDhelloworld.helloWorld
。
理解这三个概念对于编写 VS Code 扩展至关重要:
- 激活事件: 触发扩展激活的事件。
- 贡献点: 在
package.json
扩展清单 中进行的静态声明,用于扩展 VS Code。 - VS Code API: 您可以在扩展代码中调用的一组 JavaScript API。
通常,您的扩展会结合使用贡献点和 VS Code API 来扩展 VS Code 的功能。扩展功能概述 主题可以帮助您找到适合您扩展的正确贡献点和 VS Code API。
接下来,让我们更详细地查看 Hello World
示例的源代码,并了解这些概念是如何应用到它的。
扩展文件结构
.
├── .vscode
│ ├── launch.json // Config for launching and debugging the extension
│ └── tasks.json // Config for build task that compiles TypeScript
├── .gitignore // Ignore build output and node_modules
├── README.md // Readable description of your extension's functionality
├── src
│ └── extension.ts // Extension source code
├── package.json // Extension manifest
├── tsconfig.json // TypeScript configuration
您可以了解更多关于配置文件的信息:
然而,我们重点讨论 package.json
和 extension.ts
,它们是理解 Hello World
扩展的关键。
扩展清单
每个 VS Code 扩展都必须有一个 package.json
作为其 扩展清单。package.json
包含 Node.js 字段(如 scripts
和 devDependencies
)以及特定于 VS Code 的字段(如 publisher
、activationEvents
和 contributes
)。您可以在 扩展清单参考 中找到所有特定于 VS Code 的字段描述。以下是其中一些最重要的字段:
name
和publisher
: VS Code 使用<publisher>.<name>
作为扩展的唯一标识符。例如,Hello World 示例的 ID 是vscode-samples.helloworld-sample
。VS Code 使用此 ID 唯一标识您的扩展。main
: 扩展的入口点。activationEvents
和contributes
: 激活事件 和 贡献点。engines.vscode
: 这指定了扩展所依赖的最低版本的 VS Code API。
{
"name": "helloworld-sample",
"displayName": "helloworld-sample",
"description": "HelloWorld example for VS Code",
"version": "0.0.1",
"publisher": "vscode-samples",
"repository": "https://github.com/microsoft/vscode-extension-samples/helloworld-sample",
"engines": {
"vscode": "^1.51.0"
},
"categories": ["Other"],
"activationEvents": [],
"main": "./out/extension.js",
"contributes": {
"commands": [
{
"command": "helloworld.helloWorld",
"title": "Hello World"
}
]
},
"scripts": {
"vscode:prepublish": "npm run compile",
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./"
},
"devDependencies": {
"@types/node": "^8.10.25",
"@types/vscode": "^1.51.0",
"tslint": "^5.16.0",
"typescript": "^3.4.5"
}
}
注意: 如果您的扩展目标是低于 1.74 的 VS Code 版本,则必须在activationEvents
中显式列出onCommand:helloworld.helloWorld
。
扩展入口文件
扩展入口文件导出两个函数,activate
和 deactivate
。activate
在您注册的 激活事件 发生时执行。deactivate
提供了一个在扩展被停用前清理的机会。对于许多扩展来说,显式清理可能不是必需的,因此可以移除 deactivate
方法。但是,如果扩展需要在 VS Code 关闭或扩展被禁用或卸载时执行某些操作,这就是实现该功能的方法。
VS Code 扩展 API 在 @types/vscode 类型定义中声明。vscode
类型定义的版本由 package.json
中 engines.vscode
字段的值控制。vscode
类型为您提供代码中的 IntelliSense、转到定义和其他 TypeScript 语言特性。
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';
// 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);
}
// this method is called when your extension is deactivated
export function deactivate() {}
最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。