为什么需要私有扩展的管理器?
和 Eclipse IDE的插件开发类似,VS Code(Visual Studio Code)也可以很容易的对VS Code编辑器进行创建和扩展新功能,这些扩展可以涵盖代码片段、主题、语言支持、调试器等多个方面。
VS Code的扩展的安装可以在官方市场 https://marketplace.visualstudio.com/ 中进行查找和安装。但是如果企业内部或是团队内部开发了一些扩展,团队成员如何安装这些扩展呢?
当然,自定义和开发的VS Code扩展可以提交到官方的扩展市场,也可以打包成.vsix的文件,成员在各自的机器上手动安装;如果是统一的开发机器,管理员也可以进行扩展的统一安装; 最后还有一招,就是通过私有扩展管理器(Private Extension Manager) 的扩展,发布在私有的扩展管理中。
对私有扩展的管理也就衍生了一些私有扩展管理器的出现,私有扩展管理器的作用包含以下方面:
- 集中管理:
- 私有扩展管理插件提供了一个中央仓库或平台,用于存储和管理所有内部开发的VS Code扩展。这有助于团队轻松地跟踪、管理和更新这些扩展,而无需依赖公共的VS Code扩展市场。
- 访问控制:
- 通过私有扩展管理插件,企业可以实施严格的访问控制策略,确保只有经过授权的用户或团队才能访问和安装这些私有扩展。这有助于保护企业的知识产权和敏感信息不被泄露。
- 自动化分发:
- 管理插件可以自动化地将新版本的扩展分发给团队成员。当扩展更新时,团队成员可以立即获得通知,并一键安装最新版本,从而提高开发效率和团队协作效率。
- 内部依赖管理:
- 私有扩展可能依赖于其他内部开发的库、框架或工具。私有扩展管理插件可以帮助管理这些依赖项,确保它们与扩展的版本兼容,并减少版本冲突的可能性。
- 简化部署流程:
- 对于需要在新环境(如新开发机、持续集成/持续部署(CI/CD)环境)中部署VS Code扩展的团队来说,私有扩展管理插件可以大大简化部署流程。管理员可以预先配置好所有必要的扩展和设置,并在需要时一键部署到目标环境。
- 增强安全性:
- 由于私有扩展通常包含企业特有的代码和配置,因此它们比公共扩展更容易成为攻击目标。私有扩展管理插件可以通过提供安全的存储、分发和更新机制来降低这种风险。
- 促进团队协作:
- 私有扩展管理插件还可以作为团队协作的平台。团队成员可以共享扩展的开发经验、最佳实践和反馈,从而共同推动扩展的改进和优化。
- 跟踪和分析:
- 一些高级的私有扩展管理插件还提供了跟踪和分析功能,帮助团队了解哪些扩展最受欢迎、哪些扩展需要更新或重构等。这些信息对于优化扩展库和提高开发效率非常有用。
官方扩展市场的私有扩展管理器( Private Extension Manager)
在扩展官方市场,使用关键字Private Extension Manager找出的扩展不多,大概可以用的有5-6个,而且基本上没有一个一直在更新维护的,有好几个都是直接以 “Private Extension Manager”来命名的。
这里主要推荐的是名为“Private Extension Manager”的扩展,由Garmin 公司开发。
Garmin 创立于 1989 年,由高民环博士 (Dr. Min Kao) 与 Gary Burrell 共同创立。高民环博士与 Gary Burrell 曾经是一起共事,两人分别专精于 航天科技产业、GPS、导航与航空航海电子相关领域。共事时发现导航相关技术的巨大潜力,尔后一起携手创业,矢志要成为全球航空、航海、车用及户外导航和其它电子产品市场的领导者。品牌名称 Garmin,正是两人名字的组合 — Gary 与 Min。
Garmin 的 Private Extension Manager 介绍
Visual Studio Code 的扩展 Garmin 的 Private Extension Manager 是一个用于管理和安装私有或自定义 VS Code 扩展的工具。它允许用户从非公共源安装扩展,比如内部部署的服务器或私有仓库,非常适合组织内部使用。
主要特征
- 私有源支持:支持从私有服务器或特定源安装扩展。
- 版本控制:管理不同版本的扩展,确保团队成员使用的是正确的扩展版本。
- 安全性:通过私有管理,增强扩展的安全性,避免使用可能包含恶意代码的公共扩展。
- 易于集成:可以轻松集成到现有的开发环境中,支持自动化安装和更新。
- 用户友好的界面:提供图形界面用于搜索、安装和管理扩展。
安装和使用
要使用 Private Extension Manager,首先需要在 VS Code 中安装它:
- 打开 VS Code。
- 转到扩展市场,搜索
Private Extension Manager
。 - 选择找到的扩展,点击安装。
配置私有扩展源:
- 安装完扩展后,打开 VS Code 的设置。
- 搜索
Private Extension Manager
相关设置。 - 添加私有源 URL。
安装私有扩展:
- 打开 Command Palette (快捷键 F1 或者 Ctrl+Shift+P)。
- 输入
Private Extension Manager: Install Private Extension
。 - 输入或选择扩展,并进行安装。
如何发布私有扩展
发布自行开发的扩展
要允许私有扩展管理器找到扩展,要使用 vsce 以 VSIX 格式打包它,创建包含 .vsix 文件的 NPM 包,并将其发布到 NPM 注册表。扩展的 package.json 必须包含一个带有 .vsix 文件路径的文件数组,以便扩展管理器知道要安装什么。在 prepublishOnly 脚本中使用 vsce 包,以确保 NPM 包始终包含最新的扩展包。
请注意,当 Private Extension Manager 显示扩展的详细信息时,它将解压最新版本的 NPM 包以读取其 README 和 CHANGELOG 文件,但不会解压 .vsix 文件。如果扩展有图标,请确保它可以通过 HTTPS 访问,或者通过在 package.json 的文件数组中引用它直接包含在 NPM 包中。
Visual Studio Code 不支持范围扩展名,例如 @my-org/my-extension。建议创建一个仅包含 Visual Studio Code 扩展的注册表以避免名称冲突。如果需要发布到包含非 Visual Studio Code 扩展包的注册表,请在 package.json 中添加一个关键字字段,并使用相同的关键字标记所有扩展,以便可以过滤到扩展,或者确保所有非扩展包都具有范围。
使用 publishConfig 设置扩展应发布到的注册表。可能还需要使用 npm login --registry= 对此注册表进行身份验证。使用 npm publish 。发布扩展程序(不是 vsce 发布,因为后者会发布到公共扩展程序库)。
package.json 应该看起来像一个常规扩展清单,但带有额外的文件和 publishConfig 字段以及一个 prepublishOnly 脚本来处理特定于 NPM 的行为:
{
"name": "example-extension",
"displayName": "Example Extension",
"description": "This is an example extension.",
"version": "1.2.3",
"author": {
"name": "John Doe",
"email": "John.Doe@garmin.com"
},
"publisher": "garmin",
"engines": {
"vscode": "^1.40.0"
},
"icon": "media/icon.png",
"files": [
"extension.vsix",
"media/icon.png"
],
"publishConfig": {
"registry": "https://my-private.registry"
},
"scripts": {
"prepublishOnly": "vsce package -o extension.vsix",
...
},
"devDependencies": {
"vsce": "^1.69.0",
...
}
...
}
注意:在安装扩展之前不会运行准备脚本。如果有本机依赖项,则不应使用 node-gyp 在用户的机器上构建它们,而应为每个受支持的平台自行构建它们并将它们包含在 .vsix 中或将它们托管在服务器上并让扩展在运行时下载它们。
操作系统特定的扩展
默认情况下,使用文件数组中的第一个 .vsix 文件。如果每个平台都有不同的本机依赖项,则可以使用 osSpecificVsix 根据操作系统选择一个 .vsix 文件。
…
“osSpecificVsix”:{
“linux”:“extension-linux.vsix”,
“win32”:“extension-win32.vsix”,
“default”:“extension-default.vsix”,
},
…
包必须包含列出的所有文件。 default(可选)用于在没有显式键匹配的情况下选择文件;否则在不支持的平台上会显示错误。
发现和使用扩展
扩展已发布到 NPM 私有库之后,就需要告诉 Private Extension Manager 如何找到它们。这可以使用工作区配置文件和/或用户设置来完成。
工作区配置
Private Extension Manager 使用类似于 Visual Studio Code 的 extensions.json 的配置文件来允许工作区推荐扩展。在任何工作区文件夹中创建一个名为 .vscode/extensions.private.json 的文件来定义私有扩展注册表和任何推荐的扩展。您可以使用私有扩展:配置推荐扩展或私有扩展:配置工作区注册表命令打开此文件,如果尚不存在,则从模板创建它。
该文件具有以下结构:
{
"registries": [
{
"name": "My Private Registry",
"registry": "https://my-private.registry",
}
],
"recommendations": [
"garmin.example-extension"
]
}
registries 数组定义一个或多个 NPM 注册表以搜索私有扩展。每个项目支持以下字段:
- name:要显示的注册表名称。
- registry:(可选)包含扩展包的 NPM 注册表的地址。如果省略,则根据标准 NPM 配置文件确定注册表。
- query:(可选)仅显示与此搜索查询匹配的包。这可以是搜索词数组或带有空格分隔词的字符串。例如,“keywords:group1 keywords:group2”将仅显示具有关键字 group1 或 group2 的包。
- enablePagination:(可选)如果为 true,则继续从注册表请求更多包结果,直到它给出空响应。如果为 false,则只发出一个请求。默认为 true。当使用的服务器不能正确处理 NPM 搜索 API 的 from 参数时,将其设置为 false。如果禁用此功能,您可能还需要增加限制以获取所有结果。
- limit:(可选)请求包结果时限制每个查询的结果数。默认值:100。
- npm-registry-fetch 支持的任何选项。如果您需要设置身份验证、代理或其他选项,请使用这些选项。
建议数组是来自任何注册表的私有扩展的可选列表,这些扩展应该推荐给工作区的用户。扩展的标识符始终是“ p u b l i s h e r . {publisher}. publisher.{name}”。例如:“garmin.private-extension-manager”。
可能有多个包含 extensions.private.json 文件的工作区文件夹。扩展管理器将显示所有注册表和建议。
注意:如果省略查询选项,查询文本将是一个星号。某些注册表服务器(如 Verdaccio)不会对所有可用软件包做出响应,因此可能需要设置查询才能获得任何结果。
用户配置
每个用户还可以指定要使用的注册表,无论使用 privateExtensions.registries 设置打开哪个工作区。其格式与 extensions.private.json 中的 registries 数组相同。
可以使用 Private Extensions: Add Registry… 和 Private Extensions: Remove Registry 命令快速编辑此设置。
频道 Channels
发布私有扩展时,可以使用 npm dist-tags 创建跟踪频道。这样,就可以发布扩展的预发布版本或其他特殊版本,而无需更新所有用户。只有跟踪特定发布频道的用户才能获得更新。
跟踪频道
要切换扩展的发布频道,请安装扩展,然后在扩展列表中右键单击它并选择切换发布频道…。或者,单击扩展详细信息页面上的频道按钮。
可以使用 privateExtensions.channels 设置对象手动选择频道。这是一个字典,其中每个键都是一个扩展标识符(“ p u b l i s h e r . {publisher}. publisher.{name}”),每个名称都是要跟踪的 dist-tag,如下例所示:
"privateExtensions.channels": {
"garmin.example-1": "insiders", // Tracks the 'insiders' dist-tag
"garmin.example-2": "beta", // Tracks the 'beta' dist-tag
"garmin.example-3": "1.0.0" // Pins the extension to version 1.0.0
}
还可以通过列出版本而不是 dist-tag 将扩展固定到特定版本。私人扩展管理器不会通知固定扩展的更新,因此可以使用它暂时忽略扩展的较新版本。
发布到频道
要将扩展发布到频道,只需在发布时使用 npm dist-tags 指定频道名称。默认情况下,所有软件包都将引用最新标签。
npm publish . --tag=insiders
发布预发布版本时,建议使用预发布语义版本控制,例如 1.0.0-beta.0。
扩展更新
私人扩展管理器将定期检查安装的扩展是否有更新,并在发现任何更新时通知。可以调整检查间隔或使用 privateExtensions.updateCheckInterval 设置禁用它。
私人扩展侧栏面板还将用绿色箭头指示任何具有新版本的扩展。单击它将更新扩展。
通常需要重新加载 Visual Studio Code 窗口才能使更新生效。
远程开发
使用远程开发扩展(例如 Remote-SSH)时,请安装私人扩展管理器:远程助手扩展,以授予私人扩展管理器对本地计算机的访问权限。
私人扩展管理器将尝试推断 VS Code 将在哪里安装扩展。如果工作区扩展显示“本地安装”或反之亦然,请在扩展的 package.json 中设置 extensionKind 属性,以告知 VS Code 和私有扩展管理器应在何处安装扩展。
故障排除
如果成功连接到私有 NPM 注册表并且没有看到任何错误,但也没有看到任何扩展,请首先打开“输出”面板 (Ctrl+Shift+U) 并检查“私有扩展管理器”的下拉列表。如果存在,它可能包含有关扩展为何安装的信息
如果包没有被丢弃,它们可能一开始就找不到。如果未在注册表配置中指定查询或其他选项,则默认搜索查询为:
{registry-url}/-/v1/search?text=*&size=20&from=0
检查注册表服务器对此的响应。某些服务器(如Verdacio)不会用所有包的列表响应text=*,因此您可能需要更改注册表的查询选项(请参阅上面的“工作区配置”部分)。
参考
- 扩展地址: https://marketplace.visualstudio.com/items?itemName=garmin.private-extension-manager
- 源码地址: https://github.com/joelspadin-garmin/vscode-private-extension-manager