Korzystanie z interfejsu wiersza polecenia winapp z .NET MAUI (Windows)

Ten przewodnik koncentruje się na jednej pułapce charakterystycznej dla MAUI: manifest źródłowy w elemencie Platforms/Windows/Package.appxmanifest zawiera tokeny $placeholder$, których składnik winapp package nie rozpoznaje. W przypadku platformy MAUI spakuj przy użyciu manifestu wygenerowanego z obj\...\resizetizer\m\Package.appxmanifest.

Konkretny przykładowy projekt MAUI jest dostępny pod adresem samples/maui-app.

Wymagania wstępne

  1. SDK platformy .NET + obciążenie robocze MAUI (Windows):
    winget install Microsoft.DotNet.SDK.10 --source winget
    dotnet workload install maui-windows
    
  2. CLI winapp:
    winget install Microsoft.winappcli --source winget
    

1. Tworzenie aplikacji MAUI i publikowanie nagłówka Windows

dotnet new maui -n mymauiapp --no-restore
cd mymauiapp

# The stock template targets every MAUI platform. Keep only Windows when
# maui-windows is the only installed workload.
[xml]$project = Get-Content .\mymauiapp.csproj
$propertyGroup = $project.SelectSingleNode("/*[local-name()='Project']/*[local-name()='PropertyGroup'][1]")
$project.SelectNodes("/*[local-name()='Project']/*[local-name()='PropertyGroup']/*[local-name()='TargetFrameworks']") |
  ForEach-Object { $_.ParentNode.RemoveChild($_) | Out-Null }
$windowsTfm = $project.CreateElement("TargetFrameworks", $project.DocumentElement.NamespaceURI)
$windowsTfm.InnerText = "net10.0-windows10.0.19041.0"
$propertyGroup.PrependChild($windowsTfm) | Out-Null
$project.Save((Resolve-Path .\mymauiapp.csproj).Path)

dotnet publish .\mymauiapp.csproj `
  -c Release `
  -f net10.0-windows10.0.19041.0 `
  -r win-x64 `
  -p:WindowsPackageType=None `
  -p:SelfContained=true `
  -p:WindowsAppSDKSelfContained=true `
  --output .\publish\win-x64

2. Pakowanie przy użyciu wygenerowanego manifestu MAUI

$manifest = ".\obj\Release\net10.0-windows10.0.19041.0\win-x64\resizetizer\m\Package.appxmanifest"
if (-not (Test-Path $manifest)) { throw "Resolved manifest not found: $manifest" }

winapp cert generate --manifest $manifest --if-exists overwrite

winapp package .\publish\win-x64 `
  --manifest $manifest `
  --executable mymauiapp.exe `
  --cert .\devcert.pfx

3. Opcjonalne: podpisywanie rozpakowanych plików binarnych

winapp sign .\publish\win-x64\mymauiapp.exe .\devcert.pfx --password password

Skrypt walidacyjny (środowisko deweloperskie + ciągła integracja)

Użyj przykładowego skryptu testowego Pester dla MAUI:

.\scripts\test-samples.ps1 -Samples maui-app

To uruchamia samples/maui-app/test.Tests.ps1, które tworzy aplikację MAUI od podstaw, publikuje dane wyjściowe dla systemu Windows, weryfikuje ścieżkę wygenerowanego manifestu resizetizera, tworzy pakiet MSIX za pomocą winapp i podpisuje rozpakowany plik wykonywalny.

Ten sam skrypt jest również podpięty pod wpis macierzy maui-app w .github/workflows/test-samples.yml.