【译】利用 GitHub Actions 实现 Visual Studio 扩展构建自动化

发布时间:2026/10/5 11:41:43

【译】利用 GitHub Actions 实现 Visual Studio 扩展构建自动化
如果您正在开发和维护 Visual Studio 扩展程序大概率都会搭建一套构建与发布工作流 —— 无论是手动操作、脚本化的还是长期逐步拼凑而成的流程。本文面向扩展插件开发者如果您希望借助 GitHub Actions 实现 VSIX 文件的构建、版本管理与发布且流程简单、可重复执行本篇内容将为您提供相关方案。我将演示如何在我自己的各类扩展程序中实现这一操作。我长期都在使用这套方法久而久之我把重复度最高的代码片段整理成了少量可复用的小型 action这样就不用在每个代码仓库里重复编写相同逻辑了。分别为- vsix-version-stamp —— 同步统一版本号- publish-vsixgallery —— 发布持续集成构建版本用于测试- publish-marketplace —— 发布至 Visual Studio 应用市场您可以单独使用它们也可以搭配使用但我通常会把三者全部用上。如果您想查看该内容在真实代码仓库中的配置实现可以参考启 Start Screen 项目。一套真实可行的工作流程下面是一套简易配置方案和我目前所有扩展程序在用的配置大体一致name: Build on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: windows-latest env: Configuration: Release VsixManifestPath: src\source.extension.vsixmanifest VsixSourcePath: src\source.extension.cs steps: - uses: actions/checkoutv6 - name: Setup MSBuild uses: microsoft/setup-msbuildv3 - name: Restore run: msbuild /t:Restore - name: Version stamp uses: madskristensen/vsix-version-stampv2 with: manifest-file: ${{ env.VsixManifestPath }} vsix-token-source-file: ${{ env.VsixSourcePath }} - name: Build run: msbuild /p:Configuration$(Configuration) - name: Publish to VSIX Gallery uses: madskristensen/publish-vsixgalleryv1 with: vsix-file: **/*.vsix - name: Publish to Marketplace uses: madskristensen/publish-marketplacev2 with: extension-file: **/*.vsix publish-manifest-file: vs-publish.json personal-access-code: ${{ secrets.VS_MARKETPLACE_TOKEN }}这本质上就是完整流程版本管理、构建、打包与发布。您可以在此处调整发布触发时机例如仅在发布时执行但核心配置基本保持不变。保持版本同步版本控制是很容易出错的一类工作。vsix-version-stamp action 会在构建过程中自动更新版本号无需人工手动处理。它搭配 VSIX Synchronizer extension 插件使用效果尤为出色该插件可基于您的 .vsixmanifest 文件生成对应的 .cs 文件。由此可得- 唯一可信数据源- 代码内置对应版本- 发布前禁止手动修改这完全是非必需的但一旦您开始使用它就很容易离不开。发布至 Visual Studio Marketplace一旦您制作好 VSIX 文件将其发布到应用市场的操作就十分简单。您只需要一个秘诀- VS_MARKETPLACE_TOKEN- name: Publish to Marketplace uses: madskristensen/publish-marketplacev2 with: extension-file: **/*.vsix publish-manifest-file: vs-publish.json personal-access-code: ${{ secrets.VS_MARKETPLACE_TOKEN }}就这样。VSIX 文件包含扩展程序元数据发布清单则补充剩余相关信息。发布至 VSIX Gallery 用于持续集成构建与测试publish-vsixgallery action 有着不同的用途。它用于快速分发安装包。我主要会在将修复方案提交至应用商店前让他人先行测试该修复、验证相关改动时使用它。- name: Publish to VSIX Gallery uses: madskristensen/publish-vsixgalleryv1 with: vsix-file: **/*.vsix这正是 VSIX Gallery 的优势所在 —— 分发流程高效、占用资源少无需完整版本发布带来的额外开销。也可使用您自己的 Gallery。VSIX Gallery 为开源项目因此如有需要您可以搭建专属的独立部署实例。GitHub Action 支持可配置的 gallery-url因此它不会绑定至某个特定的托管 Gallery中。- name: Publish to VSIX Gallery uses: madskristensen/publish-vsixgalleryv1 with: vsix-file: **/*.vsix gallery-url: https://your-gallery.example.com这使得无论您是面向公共 Gallery 发布内容还是使用自建托管服务都能采用同一套工作流程。混搭您无需全部使用这三项操作。一些常见配置方案Minimal- Build Marketplace publishCI-focused- Build VSIX Gallery publishFull pipeline- Version stamping build gallery Marketplace选用适配您工作流程的方案即可。该如何选择发布渠道- VSIX Gallery 用于测试、分发构建包以及快速验证- Visual Studio Marketplace用于正式版本发布多数扩展建议同时使用两种渠道- 持续集成构建包上传至 VSIX Gallery- 稳定版本发布至 Visual Studio Marketplace小结这是我在所有扩展程序中统一使用的配置方案。这套方案能让流程稳定可控便于共享构建文件还能省去发布流程里绝大多数重复操作。您无需全盘照搬。可以先选用适配自身工作流的部分再在此基础上逐步完善。原文链接https://devblogs.microsoft.com/visualstudio/automating-your-visual-studio-extension-builds-with-github-actions/

相关新闻

雪花算法时钟回拨的问题,和百度UidGenerator、美团Leaf的选型对比

雪花算法时钟回拨的问题,和百度UidGenerator、美团Leaf的选型对比

2026/10/2 16:38:00

要解决分布式ID生成的难题,工业界的主流思路,可以理解为在“原生雪花算法”这棵树的主干上,长出了两个主要的分支:一类是以美团Leaf为代表的号段模式与雪花模式双修派;另一类是以百度UidGenerator为代表的极致性能派。…

智能驾驶中的车道线检测技术:从传统方法到深度学习

智能驾驶中的车道线检测技术:从传统方法到深度学习

2026/10/2 16:39:26

1. 车道线检测技术概述车道线检测作为计算机视觉在智能驾驶领域的核心应用,已经发展了近三十年。这项技术从最初的基于颜色分割的简单算法,逐步演变为如今融合深度学习与几何约束的复杂系统。在实际道路场景中,车道线不仅要应对光照变化、遮挡…

零基础做一个「每日壁纸 + 短句」静态网页

零基础做一个「每日壁纸 + 短句」静态网页

2026/10/2 16:41:14

本文使用AI做了一个「每日壁纸 短句」静态网页 1.需求 做一个极简静态网页,打开就是一张高清壁纸 一句温柔文案,干净、治愈、极简。 打开自动显示一张高清壁纸壁纸上叠加一句治愈短句 / 名言支持一键刷新换壁纸、换句子支持一键保存壁纸手机 / 电脑…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/10/4 10:56:09

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/10/4 10:54:41

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/10/5 11:17:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/10/4 17:30:40

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/10/4 5:19:11

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/10/4 10:55:30

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…