关于 winui-packaging
winui-packaging 是面向 WinUI 项目的 Windows 应用打包技能,指导开发者使用 WinApp CLI 构建、签名及准备分发包,并涵盖证书、CI/CD 与商店提交边界。
主要功能
- 01生成和安装开发证书
- 02按架构创建 MSIX 包
- 03为现有包签名和加时间戳
- 04配置自包含 Windows App SDK 运行时
- 05规划 CI/CD 打包及签名流程
适用场景
- 01为测试机器生成并信任开发证书
- 02构建多架构且未签名的 CI 工件
- 03使用生产证书对包进行时间戳签名
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ microsoft/ win-dev-skills --skill winui-packaging安装后在 Claude Code 中输入/winui-packaging确认已加载。
附带文件references/sourcegen-patterns.md
详细介绍
需要 WinApp CLI 0.7+。分析器设置请参阅 winui-dev-workflow。
快速参考
| 任务 | 命令 |
|---|---|
| 发布程序包并签名 | winapp package .\MyApp.csproj --arch x64 --cert .\devcert.pfx |
| 未签名的多架构捆绑包 | winapp package .\MyApp.csproj --arch x64 --arch arm64 --no-sign |
| 生成开发证书 | winapp cert generate |
| 信任证书(管理员) | winapp cert install ./devcert.pfx |
| 签名现有文件 | winapp sign ./app.msix ./devcert.pfx |
| 捆绑 Windows App SDK 运行时 | winapp package .\MyApp.csproj --arch x64 --cert .\devcert.pfx --self-contained |
端到端工作流
步骤 1:检查项目和部署意图
- 传入明确的项目文件,不要传入
.或猜测的bin文件夹。WinUI 项目打包使用 SDK 原生的dotnet publish打包方式,默认使用 Release,并保留项目的 AOT 设置。 - 检查清单标识、目标架构、应用 TFM 对应的 SDK,以及发布警告。
- 对于 Native AOT,请在项目中设置
<PublishAot>true</PublishAot>,并修复 IL/CsWinRT 警告;没有winapp package --aot。AOT 还需要 MSVC C++ 构建工具。请参阅源生成器模式。 - 项目打包会拒绝
WindowsPackageType=None;请先恢复打包设置(请参阅winui-dev-workflow中的 Critical Rules)。
不要为了生成发布产物而运行、注册或注销开发程序包。项目打包无需执行开发用的 winapp run --no-launch 步骤即可构建。对于 WinUI SDK 原生打包,不要传入布局覆盖选项 --manifest、--executable 或 --skip-pri;应改为修正项目或清单。
步骤 2:生成证书(一次性)
winapp cert generate --manifest .\Package.appxmanifest
此命令会创建开发用 devcert.pfx(默认密码:password)。此证书命令的 --manifest 标志会自动匹配 Package.appxmanifest 中的 Publisher 字段。请勿将 PFX 文件或密码纳入源代码管理;生产签名需要遵循组织的签名策略。
步骤 3:在指定测试计算机上信任证书(可选,需管理员权限)
winapp cert install ./devcert.pfx
此操作会将证书添加到计算机信任存储区,并在重启后保留。只有在获得批准后,才能在指定测试计算机上执行;仅在 CI 中构建或打包并不需要此操作。
步骤 4:打包并签名
winapp package .\MyApp.csproj --arch x64 --cert .\devcert.pfx
# Repeat --arch for a bundle
winapp package .\MyApp.csproj --arch x64 --arch arm64 --no-sign
选择一种签名策略:--cert 接受的是 PFX 文件,而不是证书指纹;其主题必须与清单的 Identity.Publisher 匹配。--no-sign 会保留供外部签名的产物。请使用命令报告的产物路径,不要猜测输出目录。
要进行带时间戳的生产签名,请先创建未签名程序包,然后对生成的产物签名:
# Replace MyApp.msix with the package/bundle path returned above
winapp sign .\MyApp.msix .\prod.pfx --timestamp http://timestamp.digicert.com
--timestamp 属于 winapp sign,而非 winapp package。请使用经批准的时间戳服务,并妥善保护 PFX 和密码。
步骤 5:安装或分发
如果任务包含安装或测试,请根据 winui-ui-testing 步骤 1 选择目标,并取得在该计算机上信任证书和配置依赖项的许可。仅进行打包并不意味着获得了安装应用的许可。
自包含不等于单文件
winapp package --self-contained 仅设置 WindowsAppSDKSelfContained=true,不会设置 .NET 的 SelfContained=true。如需完全自包含的 JIT .NET 应用,请在项目中同时设置两者:
<PropertyGroup>
<SelfContained>true</SelfContained>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
</PropertyGroup>
Native AOT 涵盖 .NET 运行时,但仍需选择 Windows App SDK。原生 WinUI 运行时文件会保留在可执行文件旁或程序包内;不要承诺提供单文件 WinUI EXE。某些 API 仍需要额外的 MSIX 依赖项;请参阅部署指南。
CI/CD
在配备 CLI 0.7+、应用的 .NET SDK,以及(对于 AOT)原生 C++ 工具链的 Windows 运行器上,打包步骤可以是:
winapp package .\MyApp.csproj --arch x64 --arch arm64 --no-sign
- 已提交的包引用(包括分析器)可正常还原;无需机器本地的分析器。
- 使用 CI 系统的制品步骤归档报告的
.msix/.msixbundle输出。无需启动 UI 或进行开发注册。 - 通过获批的机密存储获取生产签名材料,并在单独的受保护步骤中签名。切勿提交 PFX,也不要仅为构建而安装开发根证书。
Store 提交
将应用关联到其 Partner Center 标识,并遵循当前的提交要求(包验证、评级、屏幕截图、隐私政策)。当需要 Store 上传制品或拆分资源包时,请使用 SDK/Visual Studio 打包工作流。winapp package 会生成包制品;它不会发布到 Store,也不能替代该提交工作流。
故障排除
| 错误 | 解决方案 |
|---|---|
| "Publisher mismatch" | 运行 winapp cert generate --manifest 重新生成 |
| "Certificate not trusted" | 以管理员身份运行 winapp cert install ./devcert.pfx |
| "Access denied" | cert install 需要管理员权限 |
| "Certificate file already exists" | 使用 --if-exists overwrite 或 --if-exists skip |
| 清单缺失 / 布局覆盖被拒绝 | 检查显式项目及其原始清单;不要使用 winapp init 或布局覆盖来绕过 SDK 打包 |
| "Package installation failed" | 检查签名/信任以及确切冲突的标识;只有在确认并获授权后,才移除过时的注册 |
| 签名随时间失效 | 使用 winapp sign --timestamp 通过获批的时间戳服务进行签名 |
参考资料
| 文件 | 适用场景 |
|---|---|
| references/sourcegen-patterns.md | 设置 AOT/裁剪、JSON 源生成器、Native AOT 就绪状态、CsWin32 |