PowerToys 开发者文档全指南:从零搭建 Windows 工具集开发环境到构建、调试与打包
【免费下载链接】PowerToysMicrosoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys
PowerToys 是微软开源的一套 Windows 生产力工具集合(当前仓库根目录见 README.md),包含 FancyZones、PowerRename、PowerToys Run、键盘管理器等数十个模块。本文以仓库中面向开发者的总入口文档 doc/devdocs/readme.md 为骨架,系统梳理贡献者与二次开发者从「获取代码 → 一键配置环境 → 构建 → 调试 → 新增模块 → 提交 PR → 打包安装器」的完整路径,并结合仓库内的构建脚本、.vsconfig与 WinGet 配置源码逐项验证,帮助你在本地把整套工具集跑起来并参与到迭代中。
一、文档体系与开发入口
仓库在doc/devdocs/下维护了一份面向开发者的完整文档树,doc/devdocs/readme.md 是这份文档的总入口,按「起步(Getting Started)」「开发规范(Development Guidelines)」「协作规则(Rules)」「GitHub 工作流」「核心架构(Core Architecture)」「公共组件(Common Components)」「工具(Tools)」「流程(Processes)」等板块组织,直接对应到仓库的三大类工程:
- 原生 C++/WinUI 工程:由 PowerToys.slnx 统一管理,涵盖 runner(托盘主进程)、各个原生模块与安装器;
- 托管 .NET 工程:如 Settings UI、若干 C# 模块,分布在
src/下; - 打包与部署工程:
installer/下的 Bootstrapper(EXE)与 MSI(WiX)工程。
建议按本指南顺序先打通「构建 → 运行 → 调试」最小闭环,再结合 创建新 PowerToy 指南 深入模块开发。
二、前置条件(Prerequisites)
原文档明确列出的系统级要求如下,这是能否成功编译的前提:
- 操作系统:Windows 10 April 2018 Update(版本 1803)或更高版本;
- Visual Studio:推荐 VS 2026,或 Visual Studio 2022 17.4+,且必须安装以下工作负载/组件:
- 使用 C++ 的桌面开发(Desktop Development with C++)
- WinUI 应用程序开发
- .NET 桌面开发
- Windows 11 SDK(10.0.22621.0)
- Windows 11 SDK(10.0.26100.3916)
- .NET 8 SDK;
- Windows 长路径支持:开启后避免源码树深路径导致编译失败。
这些组件并非随手可选,仓库根目录的 .vsconfig 文件精确记录了 PowerToys 构建所需的 VS 组件清单,其中不仅包含上述工作负载,还列出了Microsoft.VisualStudio.Component.VC.ATL(含 ARM64/Spectre 变体)、Microsoft.VisualStudio.Component.Vcpkg、WindowsAppSdkSupport.CSharp/Cpp等关键项。你可以直接让 Visual Studio Installer 导入该文件,比手动勾选更可靠。
小贴士(来自原文档):仓库在 .config 目录下提供了 WinGet 配置文件,可用一条命令自动安装全部 VS 工作负载:
winget configure .config\configuration.winget按你的 VS 版本选择对应文件,例如
.config\configuration.vsProfessional.winget(VS Professional)或.config\configuration.vsEnterprise.winget(VS Enterprise)。
从仓库内容看,这一「一键装环境」不只是口头建议——.config/configuration.winget 是一个基于 WinGet Configuration(DSC)的真实可执行配置:它依次声明「启用开发者模式(WindowsSettings 资源,elevated)」「通过 winget 源安装 Visual Studio Community(WinGetPackage 资源)」「随后用 VSComponents 资源加载仓库根目录的 .vsconfig 完成组件安装」,并在文件尾部明确提示下一步手动执行git submodule update --init --recursive。也就是说,WinGet 配置负责解决工具链,子模块仍由 Git 层完成。
三、获取代码:Fork、Clone 与子模块初始化
原文档给出的标准协作流程是:
- 在 GitHub 上 Fork 本仓库;
- 将你自己的 Fork Clone 到本地;
- 运行仓库自带的自动化环境配置脚本(推荐):
.\tools\build\setup-dev-environment.ps1
setup-dev-environment.ps1 到底做了什么
我阅读了 tools/build/setup-dev-environment.ps1 的完整实现,脚本会按顺序执行 4 步,并且幂等、可重复运行:
- 启用 Windows 长路径:通过写注册表项
HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem的LongPathsEnabled = 1实现(需要管理员权限); - 启用 Windows 开发者模式:通过写注册表项
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock的AllowDevelopmentWithoutDevLicense = 1实现(需要管理员权限); - 安装 .vsconfig 中要求的 VS 组件:使用本机 Visual Studio Installer 接口按组件清单补齐工作负载;
- 初始化 git 子模块:执行
git submodule update --init --recursive。
脚本支持-Help查看全部参数。从参数定义(tools/build/setup-dev-environment.ps1)可以看到可跳过任一步骤的开关:-SkipLongPaths、-SkipDevMode、-SkipVSComponents、-SkipSubmodules,以及自定义 VS 安装路径的-VSInstallPath。原文档的 PowerShell 注释进一步说明:非管理员运行时脚本会在涉及注册表/组件安装的步骤自动触发 UAC 提权;仓库根目录通过向上查找PowerToys.slnx自动定位,因此可以从任意子目录调用。
手动搭建的替代路径
若不想用脚本(原文档也提供了折叠起来的手动流程):
- 用 Visual Studio 打开根目录的
PowerToys.slnx; - 若解决方案资源管理器弹出「install extra components」对话框,点击 install;
- 或在 Visual Studio Installer 中导入仓库根目录的 .vsconfig 自动安装全部工作负载;
- 手动初始化子模块(一次性步骤,绝大多数工程编译前必须执行):
git submodule update --init --recursive
代码中很多跨仓库依赖(如 Monaco、外部组件)都以 git submodule 形式挂接,跳过此步会导致大量工程无法还原 NuGet/vcpkg 依赖,这是新手最常见的构建失败原因。
四、编译 PowerToys:Visual Studio 与命令行双路径
原文档提供了两种构建方式,均以仓库根目录的解决方案文件 PowerToys.slnx 为编译入口。
方式一:Visual Studio IDE
- 用 VS 打开
PowerToys.slnx; - 在顶部「解决方案配置」下拉框中选择
Release或Debug; - 从「生成」菜单选择「生成解决方案」,或直接按Ctrl+Shift+B;
- 首次完整编译通常需要数分钟(取决于机器性能),完成后产物位于仓库下的
x64\Release\目录。
需要注意的模块可用性边界(原文档明确提醒):编译完成后可直接运行x64\Release\PowerToys.exe而无需安装 PowerToys,但部分模块(如 PowerRename、ImageResizer、文件资源管理器扩展等)必须额外构建并安装 installer 后才能生效。这是因为这些能力依赖外壳扩展注册与 MSIX/WiX 部署流程,光跑主程序并不会把它们注册进系统。
方式二:命令行构建脚本
仓库在 tools/build/ 下集中了构建工具链,核心脚本与用法如下:
# 构建完整解决方案(自动探测平台) .\tools\build\build.ps1 # 指定平台与配置构建 .\tools\build\build.ps1 -Platform x64 -Configuration Release # 仅构建核心工程(runner + settings),加快本地迭代 .\tools\build\build-essentials.ps1 # 构建包含安装器在内的一切(仅 Release) .\tools\build\build-installer.ps1从源码进一步印证脚本的行为与参数语义:
tools/build/build.ps1 是面向「当前目录下工程」的轻量包装器:它会 dot-source 同目录的
build-common.ps1,先调用Ensure-VsDevEnvironment定位并加载 VS 开发环境,未传-Platform时通过Get-DefaultPlatform自动探测主机平台;-Configuration默认值为Debug;可用-Path指定含.sln/.csproj/.vcxproj的目标目录;-RestoreOnly开关可只做包还原;额外位置参数会被透传给 MSBuild(例如'/p:CIBuild=true'),便于对接 CI 或私有构建属性(对应 tools/build/build.ps1 的参数定义)。tools/build/build-essentials.ps1 用于「快速迭代」场景:先对
PowerToys.slnx执行 NuGet 还原,再只编译两个关键工程——原生 runner(.\src\runner\runner.vcxproj)与设置 UI(.\src\settings-ui\Settings.UI\PowerToys.Settings.csproj),并注入/p:SolutionDir=...。也就是说,只改 runner 或 Settings 相关代码时,用这个脚本比全量构建快得多。它也支持-Platform arm64在 x64 机器上交叉产出 ARM64 版本(对应 tools/build/build-essentials.ps1)。完整的构建/CI 细节可进一步阅读 tools/build/BUILD-GUIDELINES.md,其中涵盖了更底层的构建规范与辅助脚本说明。
五、调试与新模块开发入口
完成一次成功构建后,推荐按下面两个官方文档深入:
- 调试专题:Debugging 覆盖 Visual Studio 调试器配置、附加到子进程的方法(PowerToys 是「runner + 各模块子进程」架构,很多模块需要 attach 到子进程才能断点命中),以及常见构建错误的排查。
- 新增一个 PowerToy:Creating a New PowerToy 是一份端到端指南,涵盖模块架构、设置项接入、安装器打包与测试。
如果你想为Command Palette(命令面板)编写扩展,原文档指向其独立扩展性文档(仓库文档中以 aka.ms 短链给出),介绍如何创建、打包并分发与 Command Palette 集成的自定义扩展。结合仓库可以快速定位:命令行相关源码位于 src/modules/cmdpal(其中ExtensionTemplate/TemplateCmdPalExtension/.vsconfig还自带一份扩展工程模板的 VS 组件清单),可当作最小扩展样例来对照阅读。
六、开发规范、代码风格与测试要求
原文档在「Development Guidelines」和「Rules」两节给出了硬性约定,归纳如下:
- 编码指南与最佳实践:Coding Guidelines
- 代码格式与风格约定:Coding Style
- 日志与遥测:Logging and Telemetry
- 多语言本地化:Localization
- UI 测试编写:UI Testing
- 用 VS Code 开发:Developing with VS Code
Rules 一节原文给出的核心规则是:
- Follow the pattern of what you already see in the code.(沿用仓库既有代码模式)——PowerToys 仓库同时含 C++/WinRT、C#/WinUI 等多套技术栈,紧跟既有实现是最重要的兼容性保障;
- 遵守 编码风格;
- 尽量把新功能/组件封装进「接口定义清晰」的库;
- 扩展既有代码时,把新功能封装成类,或把旧功能重构成类;
- 凡是新增/修改类与方法,都要补充或更新单元测试。
该规则与仓库实际的测试布局吻合:例如src/common/UnitTests-CommonUtils、src/modules/cmdpal下的各类单测工程,以及src/settings-ui/Settings.UI.UnitTests等,说明测试是代码合入的强约束而非可选建议。
七、GitHub 协作工作流与 PR 提交规范
原文档定义了社区贡献者需要遵守的协作流程,直接引用如下要点:
- 开工前:确保存在一个追踪该修复/特性的 issue;
- 若你具备权限,为 issue 添加
In progress标签,并补充Cost-Small/Medium/Large工作量评估及合适的标签;社区贡献者无权限打标签时,只需在 issue 下评论说明已开始工作,并尽量给出交付时间预估; - 若工作量较大(Medium/Large),用 Markdown 任务清单列出每个子项,完成后勾选更新;
- 开 PR 前必须确保本地构建成功且功能测试通过。文档特别强调这对 AI 辅助(vibe coding)贡献尤其重要——必须验证 AI 生成的代码确实能工作;仅用于讨论的探索性 PR 或 draft PR 除外;
- 开 PR 时遵循 PR 模板;
- 需要团队评审时(即使工作尚未 100% 完成),把 PR 标记为Ready For Review;评审可能要经过多轮往返,最终目标是得到可合并、可测试、符合规范的代码;
- PR 批准后:由 PR 作者负责合并;社区贡献者的 PR 可由批准的 reviewer 代为合并;
- 合并方式优先使用Squash and merge;若提交在逻辑上相互独立而不宜 squash,则使用Rebase and merge;
- 可在 PR 描述中使用 GitHub 的 closing keywords(如
Fixes #123)让 PR 合入时自动关闭关联 issue。
仓库还维护了便于协作的辅助资源:Issue/PR 命令(自动化机器人指令)与 aka.ms 短链接清单。
八、核心架构:从文档到代码的导航
原文档为开发者提供了按主题组织的架构文档索引,转换为仓库根目录相对路径后如下:
- Architecture Overview:PowerToys 整体架构与模块接口总览;
- Runner and System Tray:PowerToys Runner 主进程(系统托盘宿主)细节;
- Settings:设置系统文档;
- Installer:安装器工作原理;
- Modules:各模块文档入口。
架构的关键在于「Runner 单进程常驻 + 按需加载各模块」的分发模型,这可以在代码层得到印证:
- 主进程源码集中在 src/runner,其中 src/runner/main.cpp 负责进程启动与模块调度,src/runner/powertoy_module.cpp 定义了模块生命周期管理,而 src/runner/tray_icon.cpp 实现系统托盘交互;
- 各模块实现统一的模块接口(native 模块契约见 src/common/interop,托管模块契约见 src/common/PowerToys.ModuleContracts,其中
IModuleService.cs定义了服务接口),这也是「把新功能封装进接口清晰库」规则的落地基础。
对独立模块逐一深入前,建议先阅读 Modules 与各模块子文档(如 FancyZones、PowerRename、PowerToys Run、Mouse Without Borders 等均有专属文档)。
公共组件(Common Components)
- Context Menu Handlers:PowerToys 如何实现并注册文件资源管理器右键菜单处理器;
- Monaco Editor:多个模块如何复用 Monaco 代码编辑器组件(仓库中对应 src/Monaco 与
src/common/FilePreviewCommon/MonacoHelper.cs的封装)。
九、工具与流程(Tools & Processes)
原文档在 Tools 板块汇总了辅助开发与质量保障的工具:
- Tools 总览
- Bug Report Tool:收集日志与系统信息的 bug 上报工具(工程位于 tools/BugReportTool);
- Debugging Tools:专项调试工具;
- Fuzzing Testing:如何对 PowerToys 模块实施模糊测试(仓库也内置了相关模糊测试基础设置,可参见 src/Common.Dotnet.FuzzTest.props);
- 构建类工具直接使用 tools/build/ 下脚本(含证书管理 cert-management.ps1、打包签名 cert-sign-package.ps1 等)。
Processes 板块则面向发布与治理环节:
- Release Process:PowerToys 版本发布如何准备与推送;
- Update Process:内置更新机制如何工作(代码侧参考 src/common/updating 与 src/runner/UpdateUtils.cpp);
- GPO Implementation:组策略对象实现细节(对应 src/gpo 与
src/common/GPOWrapper)。
十、构建安装器:EXE + MSI 两段式打包
PowerToys 的安装器由两部分组成(原文档明确说明):
- EXE(Bootstrapper):内嵌 MSI,处理更复杂的安装逻辑——负责安装全部前置依赖并通过 MSI 安装 PowerToys,还支持安装参数/开关;
- MSI:安装 PowerToys 本体二进制。
编译前提
安装器只能在Release模式下编译,且步骤 1、2 必须在 MSI 编译前完成。官方给出的完整顺序是:
- 编译 PowerToys.slnx(方法见上文第四节);
- 编译 BugReportTool 工具,路径
tools\BugReportTool\BugReportTool.sln→ 仓库相对路径 tools/BugReportTool/BugReportTool.sln; - 编译 StylesReportTool 工具,路径
tools\StylesReportTool\StylesReportTool.sln→ 仓库相对路径 tools/StylesReportTool/StylesReportTool.sln; - 编译安装器解决方案
installer\PowerToysSetup.slnx→ 仓库相对路径 installer/PowerToysSetup.slnx。
更详细的安装器构建与调试方法见 Installer。若想在本地跑完整打包流水线,也可以直接调用 tools/build/build-installer.ps1:从脚本注释可知它默认以x64 + Release + PerUser(true)构建并打包 CmdPal 与安装器,处理签名(通过 tools/build/cert-sign-package.ps1)与 WiX 生成,产物输出在installer/PowerToysSetupVNext/[Platform]/[Configuration]/User[Machine]Setup下;在其它机器上安装前需用 tools/build/cert-management.ps1 导出签名证书并在目标机器上信任。若需在非本仓库机器运行完整安装流程,可参考仓库内 test-winget-install-locally 指南。
十一、给新贡献者的速查清单
综合原文档全部章节,收敛出一份可直接照做的上手清单:
- 确认系统满足前置条件(Win10 1803+、VS 2026/VS2022 17.4+ 且含 .vsconfig 所列组件、.NET 8 SDK、长路径已开启);
- Fork 并 Clone 仓库;
- 运行 tools/build/setup-dev-environment.ps1(或
winget configure .config\configuration.winget)完成环境与子模块初始化; - 在 VS 中打开 PowerToys.slnx 选择
Release/Debug构建,或使用 tools/build/build.ps1/build-essentials.ps1; - 运行
x64\Release\PowerToys.exe验证主程序;需要外壳扩展类模块时补做安装器构建与安装; - 开发前阅读 调试文档 与 新模块开发指南,并严格遵守 编码指南、编码风格 与「改代码必带测试」的规则;
- 提交 PR 前本地构建 + 测试通过,标记 Ready For Review,合入采用 Squash/ Rebase and merge;
- 涉及打包时,按第八节顺序依次编译解决方案与安装器工程。
【免费下载链接】PowerToysMicrosoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows项目地址: https://gitcode.com/GitHub_Trending/po/PowerToys
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考