winui-packaging について
winui-packagingは、WinUIプロジェクトをWindowsアプリとしてパッケージ化する開発者向けスキルです。WinApp CLIによるビルドと署名に加え、証明書、CI/CD、ストア提出の範囲を説明します。
主な機能
- 01開発用証明書の生成とインストール
- 02対象アーキテクチャ別のMSIX作成
- 03既存パッケージへのタイムスタンプ付き署名
- 04Windows App SDKランタイムの自己完結型構成
- 05CI/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 設定が維持されます。- マニフェストの ID、対象アーキテクチャ、アプリの TFM 用 SDK、リリース時の警告を確認します。
- Native AOT を使用する場合は、プロジェクトで
<PublishAot>true</PublishAot>を設定し、IL/CsWinRT の警告を解消します。winapp package --aotはありません。AOT には MSVC C++ ビルドツールも必要です。ソースジェネレーターのパターンを参照してください。 - プロジェクトのパッケージ化では
WindowsPackageType=Noneは拒否されます。パッケージ化設定に戻してください(winui-dev-workflowの重要なルールを参照)。
リリース成果物を作成するだけのために、開発用パッケージを実行/登録/登録解除しないでください。プロジェクトのパッケージ化では、開発用の 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
署名ポリシーを 1 つ選択します。--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 package ではなく、winapp sign に属します。承認済みのタイムスタンプサービスを使用し、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 をコミットしたり、ビルドのためだけに開発用ルート証明書をインストールしたりしないでください。
ストアへの提出
アプリを Partner Center の ID に関連付け、現在の提出要件(パッケージの検証、評価、スクリーンショット、プライバシーポリシー)に従ってください。ストアへのアップロード用アーティファクトやリソースパッケージの分割が必要な場合は、SDK/Visual Studio のパッケージ化ワークフローを使用してください。winapp package はパッケージアーティファクトを生成しますが、ストアへの公開や、その提出ワークフローの代替は行いません。
トラブルシューティング
| エラー | 解決策 |
|---|---|
| "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 を使用します |
| マニフェストが見つからない/レイアウトのオーバーライドが拒否される | 明示的に指定したプロジェクトと元のマニフェストを確認します。SDK のパッケージ化を回避するために winapp init やレイアウトのオーバーライドを使用しないでください |
| "Package installation failed" | 署名と信頼、および競合している正確な ID を確認します。古い登録は、確認と承認が済んだ場合に限り削除してください |
| 時間の経過後に署名が無効になる | winapp sign --timestamp を使用し、承認済みのタイムスタンプサービスで署名します |
参考資料
| ファイル | 次の場合に参照してください... |
|---|---|
| references/sourcegen-patterns.md | AOT/トリミング、JSON ソースジェネレーター、Native AOT 対応、CsWin32 の設定 |