测试扩展
Visual Studio Code支持运行和调试扩展测试。这些测试将在称为扩展开发主机的特殊VS Code实例中运行,并且可以完全访问VS Code API。我们将这些测试称为集成测试,因为它们超出了可以在没有VS Code实例的情况下运行的单元测试的范围。本文档重点介绍VS Code集成测试。
概述
如果你使用Yeoman生成器来搭建扩展项目,集成测试已经为你创建好了。
在生成的扩展中,你可以使用npm run test或yarn test来运行集成测试,这些测试会:
- 下载并解压最新版本的VS Code。
- 运行由扩展测试运行器脚本指定的Mocha测试。
调试测试
调试测试与调试扩展类似。
这是一个示例launch.json调试器配置:
{ "version": "0.2.0", "configurations": [ { "name": "Extension Tests", "type": "extensionHost", "request": "launch", "runtimeExecutable": "${execPath}", "args": [ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" ], "outFiles": ["${workspaceFolder}/out/test/**/*.js"] } ] }
测试脚本
设置好CLI后,你可以编写和运行测试。测试脚本可以访问VS Code API,并在Mocha下运行。以下是一个示例(src/test/suite/extension.test.ts):
import * as assert from 'assert'; // 你可以导入并使用'vscode'模块中的所有API // 并导入你的扩展进行测试 import * as vscode from 'vscode'; // import * as myExtension from '../extension'; suite('Extension Test Suite', () => { suiteTeardown(() => { vscode.window.showInformationMessage('All tests done!'); }); test('Sample test', () => { assert.strictEqual(-1, [1, 2, 3].indexOf(5)); assert.strictEqual(-1, [1, 2, 3].indexOf(0)); }); });
你可以使用npm test命令运行此测试,或者在安装Extension Test Runner后使用VS Code中的Test: Run All Tests命令。你还可以使用Test: Debug All Tests命令调试测试。
提示
使用Insiders版本进行扩展开发
由于VS Code的限制,如果你使用VS Code稳定版本并尝试在命令行上运行集成测试,它将抛出错误:
Running extension tests from the command line is currently only supported if no other instance of Code is running.
一般来说,如果你从命令行运行扩展测试,测试运行的版本不能已经在运行中。作为解决方法,你可以在VS Code稳定版中运行测试,并使用VS Code Insiders版用于开发。只要你不是在VS Code Insiders中而是在VS Code稳定版中从命令行运行测试,这种设置就能正常工作。
另一种方法是从VS Code本身内的调试启动配置运行扩展测试。这有额外的好处,你甚至可以调试测试。
发布扩展
一旦你创建了高质量的扩展,你可以将其发布到VS Code扩展市场,以便其他人可以找到、下载和使用你的扩展。或者,你也可以将扩展打包成可安装的VSIX格式,并与其他用户分享。
本主题涵盖:
- 使用vsce,管理VS Code扩展的命令行工具
- 打包、发布和取消发布扩展
- 注册发布者(必须有才能发布扩展)
vsce
vsce,是”Visual Studio Code Extensions”的缩写,是一个用于打包、发布和管理VS Code扩展的命令行工具。
安装
确保你已安装Node.js。然后运行:
npm install -g @vscode/vsce
使用
你可以使用vsce轻松打包和发布你的扩展:
$ cd myExtension $ vsce package # 生成myExtension.vsix $ vsce publish # <publisher id>.myExtension已发布到VS Code市场
vsce还可以搜索、检索元数据和取消发布扩展。有关所有可用vsce命令的参考,请运行vsce --help。
发布扩展
WARNING出于安全考虑,
vsce不会发布包含用户提供的SVG图像的扩展。发布工具会检查以下限制:
package.json中提供的图标不能是SVG。package.json中提供的徽章不能是SVG,除非它们来自受信任的徽章提供商。README.md和CHANGELOG.md中的图像URL需要解析为httpsURL。README.md和CHANGELOG.md中的图像不能是SVG,除非它们来自受信任的徽章提供商。
Visual Studio Code使用Azure DevOps提供市场服务。这意味着扩展的身份验证、托管和管理都是通过Azure DevOps提供的。
vsce只能使用个人访问令牌(Personal Access Tokens)发布扩展。你需要创建至少一个才能发布扩展。
获取个人访问令牌
首先,按照文档在Azure DevOps中创建你自己的组织。在以下示例中,组织名称为vscode,你应该根据需要使用新的组织名称。请注意,组织的名称不必与你的发布者名称相同。
- 从你的组织主页(例如:
https://dev.azure.com/vscode),打开你的个人资料图片旁边的用户设置下拉菜单,然后选择个人访问令牌。

- 在个人访问令牌页面上,选择新建令牌。

- 在创建新的个人访问令牌模式中,为令牌选择以下详细信息:
- 名称:你想要的令牌的任何名称
- 组织:所有可访问的组织
- 过期(可选):设置令牌所需的过期日期
- 范围:自定义:
- 单击范围部分下方的显示所有范围链接
- 在范围列表中,滚动到Marketplace并选择管理范围

- 单击创建。 你将看到新创建的个人访问令牌。复制它到安全位置,你将需要它来创建发布者。
创建发布者
发布者是可以向Visual Studio Code市场发布扩展的身份。每个扩展都需要在其package.json文件中包含一个publisher名称。
创建发布者:
- 转到Visual Studio Marketplace发布者管理页面。
- 使用你在上一节中创建个人访问令牌时所用的同一Microsoft账户登录。
- 单击左侧窗格中的创建发布者。
- 在新页面中,为新发布者指定必需的参数 - 标识符和名称(ID和名称字段):
- ID:你的发布者在Marketplace中的唯一标识符,将在你的扩展URL中使用。ID一旦创建就无法更改。
- 名称:你的发布者的唯一名称,将与你的扩展一起显示在Marketplace中。这可以是你的公司名称或品牌名称。

- (可选)填写其余字段。
- 单击创建
- 使用
vsce验证新创建的发布者。在终端中,运行以下命令,并在出现提示时输入在上一步中创建的个人访问令牌:vsce login <publisher id> https://marketplace.visualstudio.com/manage/publishers/ Personal Access Token for publisher '<publisher id>': **************************************************** The Personal Access Token verification succeeded for the publisher '<publisher id>'.
验证后,你就可以发布扩展了。
发布扩展
你可以通过两种方式发布扩展:
自动方式,使用
vsce publish命令:vsce publish如果你尚未通过上面的
vsce login命令提供个人访问令牌,vsce会要求你提供。手动方式,使用
vsce package将扩展打包成可安装的VSIX格式,然后通过Visual Studio Marketplace发布者管理页面上传。

查看扩展安装和评分
Visual Studio Marketplace发布者管理页面让你可以访问每个扩展的获取趋势(随时间变化)、总获取次数以及评分和评论。要查看报告,请点击扩展或选择More Actions > Reports。

自动增加扩展版本
发布扩展时,你可以通过指定要递增的SemVer兼容号或版本(major、minor或patch)来自动递增其版本号。例如,要将扩展的版本从1.0.0更新到1.1.0,你可以指定:
vsce publish minor
或者
vsce publish 1.1.0
这两个命令都会首先修改扩展的package.json版本属性,然后将其与更新后的版本一起发布。
NOTE如果你在git存储库中运行
vsce publish,它还会通过npm-version创建版本提交和标记。默认提交消息将是扩展的版本,但你可以使用-m标志提供自定义提交消息。(可以从提交消息中引用当前版本%s)。
取消发布扩展
你可以通过在Visual Studio Marketplace发布者管理页面单击More Actions > Unpublish来取消发布扩展。

取消发布后,扩展的可用性状态将更改为未发布,并且将不再可以从Marketplace和Visual Studio Code下载。

NOTE当你取消发布扩展时,Marketplace将保留扩展统计信息。
删除扩展
你可以通过两种方式删除扩展:
- 自动方式,使用
vsce unpublish命令:vsce unpublish <publisher id>.<extension name> - 手动方式,从Visual Studio Marketplace发布者管理页面单击More Actions > Unpublish。
在这两种情况下,系统都会提示你输入扩展名来确认删除。请注意,删除操作是不可逆的。
NOTE当你删除扩展时,Marketplace将删除所有扩展统计信息。你可能想要更新你的扩展而不是删除它。
弃用扩展
你可以仅弃用某个扩展或弃用以支持另一个扩展或设置。已弃用的扩展将在UI中以灰色删除线文本呈现。

每个已弃用的扩展右下角都有一个黄色警告图标。将鼠标悬停在扩展磁贴上时,你可以看到此图标旁边的弃用详细信息,可能是:
- 该扩展已被弃用,没有任何替代方案

- 该扩展已被弃用,取而代之的是另一个扩展

- 该扩展已被弃用,取而代之的是特定设置

VS Code不会自动迁移或卸载已安装的已弃用扩展。如果已弃用的扩展有替代扩展或设置,VS Code将显示一个迁移按钮,以帮助你快速切换到指定的替代扩展。
要将你的扩展标记为已弃用,请在”已弃用的扩展”讨论线程中留下评论。
NOTE目前,扩展在Marketplace中并未呈现为已弃用。此功能将在稍后推出。
打包扩展
如果你想要测试扩展、不发布到市场就分发它,或者私下与他人分享,你可以选择打包扩展。
打包意味着创建一个包含你的扩展的.vsix文件。然后可以将此文件安装在VS Code中。一些扩展会将.vsix文件作为其GitHub发布的一部分发布。
要打包扩展,请在扩展的根文件夹中运行以下命令:
vsce package
此命令将在扩展的根文件夹中创建一个.vsix文件。例如,my-extension-0.0.1.vsix。
对于用户,要在VS Code中安装.vsix文件,可以:
- 从扩展视图:
- 转到扩展视图
- 选择查看和更多操作…
- 选择从VSIX安装…
- 从命令行:
# 如果你使用VS Code code --install-extension my-extension-0.0.1.vsix # 如果你使用VS Code Insiders code-insiders --install-extension my-extension-0.0.1.vsix
你的扩展文件夹
要加载扩展,你需要将文件复制到VS Code扩展文件夹.vscode/extensions。根据你的操作系统,此文件夹具有不同的位置:
- Windows:
%USERPROFILE%\.vscode\extensions - macOS:
~/.vscode/extensions - Linux:
~/.vscode/extensions
Visual Studio Code兼容性
创建扩展时,你必须指定扩展兼容的VS Code版本。为此,请使用package.json中的engines.vscode参数:
{ "engines": { "vscode": "^1.8.0" } }
- 值
1.8.0(不带插入符号)表示你的扩展仅与VS Code1.8.0兼容。 - 值
^1.8.0表示你的扩展与VS Code1.8.0及更高版本兼容,包括1.8.0、1.8.1、1.9.0等。
你可以使用engines.vscode参数来确保仅为包含你依赖的API的客户端安装扩展。这种机制在稳定版本和内部版本中都能很好地发挥作用。
例如,假设VS Code的最新稳定版本是1.8.0。在1.9.0版本开发过程中,引入了新的API,并通过1.9.0-insider版本在Insider版本中提供。如果你想发布使用此API的扩展版本,你应该指定^1.9.0。这样,你的新扩展版本将仅在VS Code >=1.9.0上可用(即具有当前Insiders版本的用户)。使用VS Code稳定版的用户只有在稳定版达到1.9.0版本时才会获得更新。
高级用法
Marketplace集成
你可以自定义扩展在Visual Studio Marketplace中的展示方式。以Go扩展为例。
以下是一些让你的扩展在Marketplace上看起来更好的提示:
- 在扩展的根目录添加一个README.md文件,其中包含你希望在扩展的Marketplace页面上显示的内容。
NOTE如果你的package.json中有一个指向公共GitHub仓库的repository属性,vsce将自动检测它并相应地调整相对链接,默认使用main分支。你可以在运行vsce package或vsce publish时使用—githubBranch标志来覆盖这一点。你还可以使用—baseContentUrl和—baseImagesUrl标志为链接和图像设置基本URL。
在扩展的根目录添加一个LICENSE文件,其中包含有关扩展许可证的信息。
在扩展的根目录添加一个CHANGELOG.md文件,其中包含有关扩展更改历史的信息。
在扩展的根目录添加一个SUPPORT.md文件,其中包含如何获取扩展支持的信息。
通过在package.json中通过galleryBanner.color属性指定相应的十六进制值来设置Marketplace页面上的横幅背景颜色。
通过在package.json中通过icon属性指定包含在扩展中的128x128px PNG文件的相对路径来设置图标。
有关更多信息,请参阅Marketplace展示技巧。
验证发布者
你可以通过验证与你的品牌或身份相关的合格域名的所有权来成为已验证的发布者。一旦你的发布者通过验证,Marketplace将在你的扩展详情中添加一个已验证的徽章。
先决条件
要成为已验证的发布者,发布者必须在VS Marketplace上拥有一个或多个扩展至少6个月,并且域名的注册时间也必须至少为6个月。请等到满足这些条件后再申请验证。
要验证发布者:
在左侧窗格中,选择或创建你希望验证的发布者。
在主窗格中,选择Details(详细信息)选项卡。

在Details选项卡中,在Verified domain(已验证域名)部分,输入一个符合条件的域名。

NOTE在开始输入后,你会注意到Details选项卡标题旁边有一个星号(*)。就像在VS Code中一样,这表示你有未保存的更改。出于同样的原因,Verify(验证)按钮尚未启用。
选择Save(保存),然后选择Verify(验证)。

将出现一个对话框,为你提供有关向域名的DNS配置添加TXT记录的说明。

按照说明将TXT记录添加到你的域名的DNS配置中。
在对话框中选择Verify,以验证TXT记录已成功添加。

一旦你的TXT记录被验证,Marketplace团队将审核你的请求,并在5个工作日内告知你结果。验证包括但不限于:域名、网站和扩展先决条件的记录、内容资格、合法性、信任和良好声誉。
如果验证通过,你将在Visual Studio Marketplace发布者管理页面上的发布者名称旁边看到相应的徽章: 
注意事项:
- 对发布者显示名称的任何更改都将撤销已验证的徽章。
- 发布者违反任何未来的使用条款或上述验证将撤销已验证的徽章。
合格域名
合格域名需满足以下条件:
- 你必须能够管理DNS配置设置并添加TXT记录。
- 它不是子域名(如
{subdomain}.github.io、{subdomain}.contoso.com或类似域名)。 - 它必须使用HTTPS协议。
- 它必须能够对HEAD请求响应HTTP 200状态。
扩展定价标签
你可以选择在扩展的Marketplace页面上显示定价标签,以表明它是免费的或免费试用的。
要显示定价标签,请在你的package.json中添加pricing属性。例如:
{ "pricing": "Free" }
允许的值为:Free和Trial(区分大小写)。当未指定pricing属性时,默认值为Free。
NOTE确保在发布扩展时使用vsce版本 >= 2.10.0,以使定价标签正常工作。
扩展赞助
你可以选择接受赞助,为用户提供一种支持你工作的方式。
要显示赞助链接,请在你的package.json中添加sponsor属性。例如:
"sponsor": { "url": "https://github.com/sponsors/nvaccess" }
NOTE确保在发布扩展时使用vsce版本 >= 2.9.1,以使赞助功能正常工作。
赞助链接将出现在Marketplace和VS Code中扩展详情页面的标题部分:

我们希望这将使用户能够资助他们依赖的扩展,以提高扩展的性能、可靠性和稳定性。
使用.vscodeignore
你可以创建一个.vscodeignore文件,以防止某些文件包含在扩展包中。此文件是一个glob模式集合,每行一个。例如:
**/*.ts **/tsconfig.json !file.ts
你应该忽略运行时不需要的所有文件。例如,如果你的扩展是用TypeScript编写的,你应该忽略所有**/*.ts文件,就像上面的例子中一样。
NOTE
devDependencies中列出的开发依赖项将被自动忽略,所以你不需要显式地添加它们。
发布前步骤
你可以在清单文件中添加发布前步骤,该步骤将在每次打包扩展时被调用。例如,你可能想在这个阶段调用TypeScript编译器:
{ "name": "uuid", "version": "0.0.1", "publisher": "someone", "engines": { "vscode": "0.10.x" }, "scripts": { "vscode:prepublish": "tsc" } }
预发布扩展
用户可以在VS Code或VS Code Insiders中安装扩展的预发布版本,以便在官方扩展发布前定期获取最新的扩展版本。

要发布预发布版本,请在vsce package或vsce publish命令中传递--pre-release标志:
vsce package --pre-release vsce publish --pre-release
我们只支持扩展版本的major.minor.patch格式,不支持semver预发布标签。预发布和常规发布版本之间的版本必须不同。也就是说,如果1.2.3作为预发布版本上传,下一个常规发布版本必须使用不同的版本上传,例如1.2.4。完整的semver支持将在未来提供。
VS Code会自动将扩展更新到可用的最高版本,所以即使用户选择了预发布版本,如果有一个具有更高版本的扩展发布版本,用户将被更新到该发布版本。因此,我们建议扩展使用major.偶数.patch作为发布版本,使用major.奇数.patch作为预发布版本。例如:0.2.*用于发布版本,0.3.*用于预发布版本。
如果扩展作者不希望其预发布用户更新到发布版本,我们建议在发布发布版本之前始终递增并发布新的预发布版本,以确保预发布版本始终更高。请注意,虽然如果发布版本更高,预发布用户将被更新到发布版本,但他们仍然有资格自动更新到比发布版本具有更高版本号的未来预发布版本。
预发布扩展在VS Code版本1.63.0之后受支持,因此所有预发布扩展的package.json中的engines.vscode值应设置为>= 1.63.0。
NOTE已经有单独的独立预发布扩展的扩展应该联系VS Code团队,以启用自动卸载过时的单独扩展并安装主扩展的预发布版本。
平台特定扩展
你可以为VS Code运行的每个平台(Windows、Linux、macOS)发布扩展的VSIX包。我们称这些扩展为平台特定扩展。
从版本1.61.0开始,VS Code会查找与当前平台匹配的扩展包。
如果你的扩展有平台特定的库或依赖项,平台特定扩展很有用,这样你可以控制平台包中包含的确切二进制文件。常见的用例是使用本地node模块。
平台特定扩展作为包含平台特定内容的单独包发布。你可以通过传递--target标志来指定目标平台。如果不传递此标志,该包将用作没有平台特定包的所有平台的后备。
当前可用的平台有:win32-x64、win32-arm64、linux-x64、linux-arm64、linux-armhf、alpine-x64、alpine-arm64、darwin-x64、darwin-arm64和web。
如果你希望平台特定扩展也支持在浏览器中作为Web扩展运行,在发布时它必须以web平台为目标。web平台尊重package.json中的browser入口点。要禁用在web中不支持的扩展功能,我们建议使用package.json中的when子句,而不是为web平台发送单独的package.json或删除在web中不工作的VSIX部分。
发布
从版本1.99.0开始,vsce支持--target参数,允许你在打包和发布VSIX时指定目标平台。
以下是如何为win32-x64和win32-arm64平台发布VSIX的方法:
vsce publish --target win32-x64 win32-arm64
或者,你也可以在打包时使用--target标志来创建平台特定的VSIX。例如,要为win32-x64平台打包VSIX,然后发布它:
vsce package --target win32-x64 vsce publish --packagePath PATH_TO_WIN32X64_VSIX
持续集成
管理多个平台特定的VSIX可能会变得繁重,因此我们建议使用持续集成(CI)工具自动化扩展的构建过程。例如,你可以使用GitHub Actions构建你的扩展。我们的平台特定扩展示例可以作为学习的起点:它的工作流程实现了使用平台特定扩展支持将本地node模块作为依赖项分发到所有支持的VS Code目标的常见场景。