本文档涵盖了 PowerToys 的自动化构建和部署基础设施,包括 CI/CD 管道、代码签名流程、本地化工作流程和分发机制。该管道确保 PowerToys 发行版的代码质量、安全合规性和多语言支持。
有关安装方法和面向用户的更新机制的信息,请参阅 安装方法 和 更新系统。
PowerToys 构建和部署管道是一个全面的自动化系统,可将源代码转换为已签名、本地化和可分发的软件包。该管道集成了多个 Microsoft 企业服务,以确保安全、本地化和分发合规性。
来源: .pipelines/ESRPSigning_core.json .pipelines/ESRPSigning_installer.json .pipelines/versionAndSignCheck.ps1 .pipelines/loc/loc.yml
构建过程使用 MSBuild 和自定义目标及模板来编译 PowerToys 解决方案。该系统包括针对不同模块类型和 WinUI3 应用程序的专用构建配置。
PowerToys 使用分层 MSBuild 配置系统,通过 Directory.Build.targets 文件来为不同组件自定义构建过程
| 组件类型 | 构建目标 | 目的 |
|---|---|---|
| 根目录 | Directory.Build.targets | 全局构建设置和 Microsoft.Build.CopyOnWrite SDK |
| 键盘管理器 | src/modules/keyboardmanager/Directory.Build.targets | 使用 convert-resx-to-rc.ps1 生成资源文件 |
| 设置 UI | src/settings-ui/Directory.Build.targets | WinUI3 特定构建优化 |
根目录的 Directory.Build.targets 集成了 Microsoft 的构建缓存优化
来源: Directory.Build.targets1-6 src/modules/keyboardmanager/Directory.Build.targets src/settings-ui/Directory.Build.targets
Keyboard Manager 模块包含一个专门的构建目标,用于将 .resx 文件转换为 Windows RC 格式,以便与原生 C++ 集成
src/modules/keyboardmanager/Directory.Build.targets4-6
此过程使用 convert-resx-to-rc.ps1 脚本,从基础资源模板生成 resource.h 和 KeyboardManager.rc 文件。
来源: src/modules/keyboardmanager/Directory.Build.targets4-6
PowerToys 使用 Microsoft 的 ESRP(企业签名和发布流程)系统来实现企业级代码签名。签名过程通过两个 JSON 配置文件进行配置,这些文件为核心组件和安装程序指定了不同的签名策略。
ESRPSigning_core.json 配置定义了 224 个 PowerToys 组件的签名,这些组件分为两个签名批次
批次 1 (KeyCode CP-230012):PowerToys 自主创建的二进制文件,包括
PowerToys.exe、PowerToys.Settings.exe批次 2 (KeyCode CP-231522):第三方库和依赖项
ModernWpf.dll、Newtonsoft.Json.dll、WebView2Loader.dll两个签名操作都使用一致的参数来确保安全和合规性
| 参数 | 值 | 目的 |
|---|---|---|
OpusName | "Microsoft" | 发布者标识 |
OpusInfo | "http://www.microsoft.com" | 发布者 URL |
FileDigest | “/fd SHA256” | SHA-256 文件摘要算法 |
PageHash | “/NPH” | 禁用页面哈希以提高性能 |
TimeStamp | RFC3161 时间戳服务器 | 时间戳验证 |
来源: .pipelines/ESRPSigning_core.json226-264 .pipelines/ESRPSigning_installer.json11-50
versionAndSignCheck.ps1 脚本提供了构建输出的自动验证,以确保所有二进制文件都具有正确的版本和有效的代码签名。
验证脚本维护了经过筛选的组件异常列表,这些组件拥有合法的不同版本模式
版本异常 .pipelines/versionAndSignCheck.ps111-29:Windows App SDK 投影和使用 0.0.0.0 或 1.0.0.0 版本的第三方组件。
Null 版本异常 .pipelines/versionAndSignCheck.ps130-52:不包含版本资源的系统库和可再发行组件。
来源: .pipelines/versionAndSignCheck.ps168-96
PowerToys 通过 Microsoft 的 Touchdown Build 本地化系统支持 40 多种语言。本地化管道按计划运行,并处理整个代码库中的资源文件。
本地化系统处理三种类型的资源文件
| 模式 | 文件类型 | 用途 |
|---|---|---|
**\Resources.resx | .NET 资源文件 | Windows Forms 和 WPF 组件 |
**\Resource.resx | .NET 资源文件 | 单个模块资源 |
**\Resources.resw | UWP 资源文件 | WinUI3 应用程序和 UWP 组件 |
本地化管道使用以下 Touchdown Build 配置
appendRelativeDir: true 保留相对目录结构来源: .pipelines/loc/loc.yml28-41 .pipelines/v2/templates/steps-fetch-and-prepare-localizations.yml7-26
构建管道集成了多项安全和合规机制,以确保 PowerToys 符合 Microsoft 的安全标准。
团队安全顾问 (TSA) 配置文件定义了安全扫描和分析参数
此配置会将安全分析结果路由到 Windows 组织结构内的 PowerToys 团队。
构建管道会生成多种分发格式,以支持不同的安装场景和用户偏好。每种格式都经过相同的严格构建和签名过程,但面向不同的分发渠道。
| 分发格式 | 目标渠道 | 包类型 | 主要用例 |
|---|---|---|---|
| WiX 安装程序 | GitHub Releases | 引导程序 .exe + .msi | 手动安装、企业部署 |
| MSIX 包 | Microsoft Store | .msix | Store 分发、自动更新 |
| WinGet 包 | Windows Package Manager | 清单 + 安装程序 | 命令行包管理 |
两个 ESRP 签名配置中的签名组件被打包成这些分发格式,确保了所有渠道上一致且安全的分发体验。
来源: .pipelines/ESRPSigning_core.json .pipelines/ESRPSigning_installer.json