Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
6d969bc
Fix flaky InstallerFunctionalTests::RunInstallerAndVerifyPackages: re…
v-arlysenko May 14, 2026
10f7322
Automate Patch and Revision versions using Azure DevOps Variable Libr…
Dreynor87 May 14, 2026
9b5d40a
WinUI templates for dotnet new and VSIX (#6407)
DinahK-2SO May 18, 2026
a783b4d
Fix SamplesCompatTest NU1605: insert missing PackageVersion entries w…
v-arlysenko May 18, 2026
1bf2a95
Fix Pipeline Error VSSDK1300 in CreateVsix: shorten Dev17 VSIX interm…
DinahK-2SO May 25, 2026
b7a3ea1
dotnet new WinUI3 templates 0.0.6-alpha (#6510)
DinahK-2SO May 27, 2026
60daee2
ApplicationData: Refactor to dual-type pattern for packaged/unpackage…
Scottj1s May 27, 2026
912dbdf
Use IsPackagedProcess() for package detection in PRI fallback (#6500)
guimafelipe May 28, 2026
b2a79b9
[main] Update dependencies from microsoft/ProjectReunion/WindowsAppSD…
dotnet-maestro[bot] May 28, 2026
0c48f85
[main] Update dependencies from microsoft/LiftedIXP/DCPP (#6430)
dotnet-maestro[bot] May 29, 2026
fe1eb33
Add missing AppIcon.ico entry to C# SingleProjectPackagedApp and Wapp…
lauren-ciha Jun 1, 2026
7ce6781
Set <GenerateProgramFile> to false in UnitTest project template to fi…
lauren-ciha Jun 1, 2026
d4e1798
RuntimeCompatibilityOptions: Containment v2 foundation (catalog + App…
Scottj1s Jun 4, 2026
f9f3c39
[WinAppSDK CMake Support]: Implicitly choose deployment mode based on…
ssparach Jun 8, 2026
9bde038
Add Templates PR validation pipeline (dotnet new + VSIX) (#6526)
DinahK-2SO Jun 8, 2026
5341a42
Resolve Merge Conflicts
kythant Jun 8, 2026
4c16568
FI fixups: squashed conflict resolution adjustments
kythant Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,8 @@ PublishScripts/
*.nupkg
# NuGet Symbol Packages
*.snupkg
# Visual Studio Extension build output (source files are *.vsixmanifest, not affected)
*.vsix
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
Expand Down
48 changes: 46 additions & 2 deletions BuildAll.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<#
<#
This script is to build the Foundation transport package that will be used to generate the windows app sdk package.
This script is called from BuildAll.ps1 from the aggregator repo and should not be called directly.

Expand Down Expand Up @@ -179,7 +179,7 @@ Try {
.\tools\GenerateDynamicDependencyOverrides.ps1 -Path "$buildOverridePath"
.\tools\GeneratePushNotificationsOverrides.ps1 -Path "$buildOverridePath"

if ($AzureBuildStep -ne "all")
if ($AzureBuildStep -ne "all" -and $AzureBuildStep -ne "BuildTemplates")
{
# Some builds have "-branchname" appended, but when this happens the environment variable
# TFS_BUILDNUMBER has the un-modified version.
Expand Down Expand Up @@ -666,6 +666,50 @@ Try {
exit 1
}
}
if (($AzureBuildStep -eq "all") -Or ($AzureBuildStep -eq "BuildTemplates"))
{
#------------------
# Build WinUI template artifacts:
# - dotnet-new NuGet (Microsoft.WindowsAppSDK.WinUI.CSharp.Templates.*.nupkg)
# - templates VSIX (Standalone + Component, x C# + C++ = 4 .vsix)
#
# All artifacts land in <repo>\localpackages\ so a single dev workflow
# (the docs, the csproj's <PackageOutputPath> default, the NuGet.config
# "localpackages" feed, and Test-DotnetNewTemplates.ps1) all agree on
# one path. .vsix files coexist fine; NuGet only sees *.nupkg.
#------------------
$templatesOutputDir = Join-Path $env:Build_SourcesDirectory "localpackages"
if (-not (Test-Path $templatesOutputDir))
{
New-Item -ItemType Directory -Path $templatesOutputDir -Force | Out-Null
}

write-host "Packing dotnet-new templates (Microsoft.WindowsAppSDK.WinUI.CSharp.Templates) ..."
& dotnet pack "dev\Templates\Dotnet\WinAppSdk.CSharp.DotnetNewTemplates.csproj" `
--configuration $Configuration `
--output $templatesOutputDir
if ($lastexitcode -ne 0)
{
write-host "ERROR: dotnet pack WinAppSdk.CSharp.DotnetNewTemplates.csproj FAILED."
exit 1
}

# Templates VSIX (Standalone + Component, matching CI). The
# Microsoft.WindowsAppSDK version used for restore comes from
# dev\Templates\Directory.Build.props (<WindowsAppSdkVersion> default)
# - single source of truth.
write-host "Building templates VSIX (Standalone + Component) ..."
& "dev\Templates\VSIX\build-local-VSIX-package\Build-VSIX-Local.ps1" `
-Configuration $Configuration `
-Deployment Both `
-RepoRoot $env:Build_SourcesDirectory `
-OutputDir $templatesOutputDir
if ($lastexitcode -ne 0)
{
write-host "ERROR: Build-VSIX-Local.ps1 FAILED."
exit 1
}
}
$files = Get-ChildItem $OutputDirectory -File -Filter "*.nupkg"
foreach ($file in $files)
{
Expand Down
8 changes: 4 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@
ValueOrDefault resolves to $(WindowsAppSDKVersionPinned) when set (mono-build),
otherwise falls back to the pinned version literal. -->
<PropertyGroup Label="WindowsAppSDK Package Version Properties">
<MicrosoftWindowsAppSDKBasePackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '2.0.3-dev.experimental1'))</MicrosoftWindowsAppSDKBasePackageVersion>
<MicrosoftFrameworkUdkPackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-27300.1866.260419-1600.1'))</MicrosoftFrameworkUdkPackageVersion>
<MicrosoftProjectReunionInteractiveExperiencesTransportPackagePackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-27300.1866.260419-1600.1'))</MicrosoftProjectReunionInteractiveExperiencesTransportPackagePackageVersion>
<MicrosoftWindowsAppSDKInteractiveExperiencesPackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-Rolling.20260419.2'))</MicrosoftWindowsAppSDKInteractiveExperiencesPackageVersion>
<MicrosoftWindowsAppSDKBasePackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '2.0.6-dev.experimental1'))</MicrosoftWindowsAppSDKBasePackageVersion>
<MicrosoftFrameworkUdkPackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-27300.1878.260525-0800.0'))</MicrosoftFrameworkUdkPackageVersion>
<MicrosoftProjectReunionInteractiveExperiencesTransportPackagePackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-27300.1878.260525-0800.0'))</MicrosoftProjectReunionInteractiveExperiencesTransportPackagePackageVersion>
<MicrosoftWindowsAppSDKInteractiveExperiencesPackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '3.0.0-experimental-Rolling.20260525.1'))</MicrosoftWindowsAppSDKInteractiveExperiencesPackageVersion>
<MicrosoftWindowsAppSDKAppLicensingInternalTransportPackagePackageVersion>$([MSBuild]::ValueOrDefault('$(WindowsAppSDKVersionPinned)', '1.7.0-main.20241009.0'))</MicrosoftWindowsAppSDKAppLicensingInternalTransportPackagePackageVersion>
</PropertyGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ parameters:
# preserves the legacy name so non-monobuild callers don't need to opt in.
- name: artifactName
type: string
default: 'WindowsAppSDK_Nuget_And_MSIX'
default: 'WindowsAppSDK-NuGet-And-MSIX'
# When true, skip the artifact download step entirely. The caller is responsible
# for ensuring $(parameters.artifactName) content is already present at
# $(System.ArtifactsDirectory) before this template's first MSBuild step. Used by
Expand All @@ -34,6 +34,12 @@ parameters:
- name: SkipArtifactDownload
type: boolean
default: false
# Branch (in the Aggregator pipeline's repo) to pull the latest Windows App SDK
# nuget from when UseCurrentBuild is false. The Aggregator nightly runs daily on
# 'main', so default there. Override if the active publishing branch changes.
- name: NightlyBranchName
type: string
default: 'refs/heads/release/dev/monobuild'

steps:
- task: PowerShell@2
Expand Down Expand Up @@ -69,19 +75,28 @@ steps:
condition: and(succeeded(), ne(variables.SkipInstallerBuild, true))
- ${{ else }}:
###
# This step downloads the WindowsAppSDK NuGet package from a pipeline
# variables: OfficialPipelineID LatestOfficialBuildID
# for use in building the Installers
# This step downloads the WindowsAppSDK NuGet package from the Aggregator nightly
# pipeline (identified by the OfficialPipelineID variable) for use in building the
# VSIX. We pull the latest run from NightlyBranchName rather than a pinned
# LatestOfficialBuildID so PR build-validation runs always get a fresh package without
# needing a build id supplied at queue time.
#
# The nightly runs commonly finish as PartiallySucceeded (some downstream test/SDL
# stages are not green) even though the packaging stage produced the artifact, so
# both allowPartiallySucceededBuilds and allowFailedBuilds must be true -- the task
# requires the pair to be set together to consider non-succeeded runs.
- task: DownloadPipelineArtifact@2
displayName: 'Download WindowsAppSDK From Latest Nightly'
inputs:
artifactName: ${{ parameters.artifactName }}
targetPath: '$(System.ArtifactsDirectory)'
source: 'specific'
project: 55e8140e-57ac-4e5f-8f9c-c7c15b51929d # TODO: replace with $(System.TeamProjectId) once we can have a full WinAppSDK Build on the new mono repo
pipeline: $(OfficialPipelineID)
pipelineId: $(LatestOfficialBuildID)
condition: and(succeeded(), ne(variables.SkipInstallerBuild, true))
project: $(System.TeamProjectId)
pipeline: 190463
runVersion: 'latestFromBranch'
runBranch: '${{ parameters.NightlyBranchName }}'
allowPartiallySucceededBuilds: true
allowFailedBuilds: true

###
# Install the internal licensing support for release-signed packages. This can always be present in
Expand Down
59 changes: 40 additions & 19 deletions build/AzurePipelinesTemplates/WindowsAppSDK-BuildVSIX-Steps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ parameters:
# preserves the legacy name so non-monobuild callers don't need to opt in.
- name: artifactName
type: string
default: 'WindowsAppSDK_Nuget_And_MSIX'
default: 'WindowsAppSDK-NuGet-And-MSIX'
# When true, skip the artifact download step entirely. The caller is responsible
# for ensuring $(parameters.artifactName) content is already present at
# $(System.ArtifactsDirectory) before ExtractWindowsAppSDKVersion runs. Used by
Expand All @@ -41,6 +41,17 @@ parameters:
- name: SkipArtifactDownload
type: boolean
default: false
# Defaults true to preserve official-build behavior.
# Set to false in PR build-validation runs to skip pushing to the symbol server.
- name: PublishSymbols
type: boolean
default: true
# Branch (in the Aggregator pipeline's repo) to pull the latest Windows App SDK
# nuget from when UseCurrentBuild is false. The Aggregator nightly runs daily on
# 'main', so default there. Override if the active publishing branch changes.
- name: NightlyBranchName
type: string
default: 'refs/heads/release/dev/monobuild'

steps:
- ${{ if eq(parameters.SkipArtifactDownload, false) }}:
Expand All @@ -52,19 +63,29 @@ steps:
targetPath: '$(System.ArtifactsDirectory)'
- ${{ else }}:
###
# This step downloads the WindowsAppSDK NuGet package from a pipeline
# variables: OfficialPipelineID LatestOfficialBuildID
# for use in building the VSIX
# This step downloads the WindowsAppSDK NuGet package from the Aggregator nightly
# pipeline (identified by the OfficialPipelineID variable) for use in building the
# VSIX. We pull the latest run from NightlyBranchName rather than a pinned
# LatestOfficialBuildID so PR build-validation runs always get a fresh package without
# needing a build id supplied at queue time.
#
# The nightly runs commonly finish as PartiallySucceeded (some downstream test/SDL
# stages are not green) even though the packaging stage produced the artifact, so
# both allowPartiallySucceededBuilds and allowFailedBuilds must be true -- the task
# requires the pair to be set together to consider non-succeeded runs.
- task: DownloadPipelineArtifact@2
displayName: 'Download WindowsAppSDK From Latest Nightly'
inputs:
artifactName: ${{ parameters.artifactName }}
targetPath: '$(System.ArtifactsDirectory)'
source: 'specific'
project: 55e8140e-57ac-4e5f-8f9c-c7c15b51929d # TODO: replace with $(System.TeamProjectId) once we can have a full WinAppSDK Build on the new mono repo
pipeline: $(OfficialPipelineID)
pipelineId: $(LatestOfficialBuildID)

project: $(System.TeamProjectId)
pipeline: 190463
runVersion: 'latestFromBranch'
runBranch: '${{ parameters.NightlyBranchName }}'
allowPartiallySucceededBuilds: true
allowFailedBuilds: true

- task: PowerShell@2
name: ExtractWindowsAppSDKVersion
displayName: Extract WindowsAppSDKVersion
Expand Down Expand Up @@ -113,15 +134,15 @@ steps:
- task: VSBuild@1
displayName: 'Restore WindowsAppSDK.Extension.sln'
inputs:
solution: $(FoundationRepoPath)dev\VSIX\WindowsAppSDK.Extension.sln
solution: $(FoundationRepoPath)dev\Templates\VSIX\WindowsAppSDK.Extension.sln
platform: 'Any CPU'
configuration: '$(buildConfiguration)'
msBuildArgs: '/t:restore /p:OptionalVSIXVersion="${{ parameters.OptionalVSIXVersion }}" /p:WindowsAppSDKVersion="$(WindowsAppSDKPackageVersion)" /p:RestoreAdditionalProjectSources="$(System.ArtifactsDirectory)" /p:EnableExperimentalVSIXFeatures="${{ parameters.EnableExperimentalVSIXFeatures }}" /binaryLogger:$(ob_outputDirectory)\binlogs\StandaloneVSIX.restore.binlog'

- task: VSBuild@1
displayName: 'Build Standalone WindowsAppSDK.Extension.sln'
inputs:
solution: $(FoundationRepoPath)dev\VSIX\WindowsAppSDK.Extension.sln
solution: $(FoundationRepoPath)dev\Templates\VSIX\WindowsAppSDK.Extension.sln
platform: 'Any CPU'
configuration: '$(buildConfiguration)'
msBuildArgs: '/p:OptionalVSIXVersion="${{ parameters.OptionalVSIXVersion }}" /p:WindowsAppSDKVersion="$(WindowsAppSDKPackageVersion)" /p:EnableExperimentalVSIXFeatures="${{ parameters.EnableExperimentalVSIXFeatures }}" /binaryLogger:$(ob_outputDirectory)\binlogs\StandaloneVSIX.build.binlog'
Expand All @@ -147,15 +168,15 @@ steps:
- task: VSBuild@1
displayName: 'Restore Component WindowsAppSDK.Extension.sln'
inputs:
solution: $(FoundationRepoPath)dev\VSIX\WindowsAppSDK.Extension.sln
solution: $(FoundationRepoPath)dev\Templates\VSIX\WindowsAppSDK.Extension.sln
platform: 'Any CPU'
configuration: '$(buildConfiguration)'
msBuildArgs: '/t:restore /p:OptionalVSIXVersion="${{ parameters.OptionalVSIXVersion }}" /p:WindowsAppSDKVersion="$(WindowsAppSDKPackageVersion)" /p:RestoreAdditionalProjectSources="$(System.ArtifactsDirectory)" /p:EnableExperimentalVSIXFeatures="${{ parameters.EnableExperimentalVSIXFeatures }}" /binaryLogger:$(ob_outputDirectory)\binlogs\ComponentVSIX.restore.binlog'

- task: VSBuild@1
displayName: 'Build Component WindowsAppSDK.Extension.sln'
inputs:
solution: $(FoundationRepoPath)dev\VSIX\WindowsAppSDK.Extension.sln
solution: $(FoundationRepoPath)dev\Templates\VSIX\WindowsAppSDK.Extension.sln
platform: 'Any CPU'
configuration: '$(buildConfiguration)'
msBuildArgs: '/restore /p:OptionalVSIXVersion="${{ parameters.OptionalVSIXVersion }}" /p:WindowsAppSDKVersion="$(WindowsAppSDKPackageVersion)" /p:EnableExperimentalVSIXFeatures="${{ parameters.EnableExperimentalVSIXFeatures }}" /p:Deployment="Component" /binaryLogger:$(ob_outputDirectory)\binlogs\ComponentVSIX.build.binlog'
Expand Down Expand Up @@ -188,7 +209,7 @@ steps:
- task: CopyFiles@2
displayName: 'Stage unsigned VSIX files for publishing'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
Contents: '**/WindowsAppSDK.*.vsix'
flattenFolders: true
TargetFolder: '$(ob_outputDirectory)\VSIX'
Expand All @@ -197,7 +218,7 @@ steps:
- task: CopyFiles@2
displayName: 'Stage unsigned VSIX files for signing'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
Contents: '**/WindowsAppSDK.*.vsix'
flattenFolders: true
TargetFolder: '$(Agent.TempDirectory)/UnsignedVSIX'
Expand All @@ -221,37 +242,37 @@ steps:
parameters:
IsMonobuild: ${{ parameters.IsMonobuild }}
InnerParams:
SearchPattern: '$(FoundationRepoPath)dev\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)\**\WindowsAppSDK*.pdb'
SearchPattern: '$(FoundationRepoPath)dev\Templates\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)\**\WindowsAppSDK*.pdb'
IsOfficial: ${{ parameters.IsOfficial }}

- task: CopyFiles@2
displayName: 'Stage VSIX component JSONs'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
Contents: '**/WindowsAppSDK*.pdb'
flattenFolders: true
TargetFolder: '$(ob_outputDirectory)\symbols'

- task: CopyFiles@2
displayName: 'Stage VSIX component JSONs'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX\BuildOutput\obj\AnyCPU$(buildConfiguration)'
Contents: '**/WindowsAppSDK.*.Component.json'
flattenFolders: true
TargetFolder: '$(ob_outputDirectory)'

- task: CopyFiles@2
displayName: 'Stage VSIX manifest'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX'
Contents: 'extension.manifest.json'
flattenFolders: true
TargetFolder: '$(ob_outputDirectory)'

- task: CopyFiles@2
displayName: 'Stage VSIX overview markdown'
inputs:
SourceFolder: '$(FoundationRepoPath)dev\VSIX'
SourceFolder: '$(FoundationRepoPath)dev\Templates\VSIX'
Contents: 'overview.md'
flattenFolders: true
TargetFolder: '$(ob_outputDirectory)'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
parameters:
- name: pool
type: object
default:
vmImage: 'windows-latest'
- name: dependsOnStage
type: string
default: 'DotnetNewTemplates_Build'

stages:
- stage: DotnetNewTemplates_Publish
displayName: 'Publish dotnet new templates to NuGet.org'
dependsOn:
- ${{ parameters.dependsOnStage }}
jobs:
- job: PublishNuGetOrg
displayName: 'Publish dotnet new template pack to NuGet.org'
pool: ${{ parameters.pool }}
variables:
ob_outputDirectory: '$(Pipeline.Workspace)\drop_DotnetNewTemplates_Build_PackDotnetNewTemplates'
ob_artifactBaseName: 'dotnet-new-template-pack'
dotnetTemplatesArtifactPath: '$(Pipeline.Workspace)\drop_DotnetNewTemplates_Build_PackDotnetNewTemplates'
steps:
- checkout: self

- download: current
displayName: 'Download dotnet new template pack artifact'
artifact: 'drop_DotnetNewTemplates_Build_PackDotnetNewTemplates'

- task: PowerShell@2
displayName: 'Verify dotnet new template pack artifact exists'
inputs:
targetType: inline
script: |
$artifactPath = '$(dotnetTemplatesArtifactPath)'
if (-not (Test-Path $artifactPath)) {
throw "Expected artifact directory '$artifactPath' was not found in the downloaded drop artifact."
}
$packages = Get-ChildItem -Path $artifactPath -Filter *.nupkg -File -Recurse
if (-not $packages) {
throw "No .nupkg files were found under '$artifactPath'."
}
Write-Host "Found the following packages ready for publish:"
$packages | ForEach-Object { Write-Host " - $($_.FullName)" }

- task: 333b11bd-d341-40d9-afcf-b32d5ce6f23b@2
displayName: 'Publish dotnet new templates to NuGet.org'
inputs:
command: 'push'
packagesToPush: '$(dotnetTemplatesArtifactPath)\*.nupkg'
verbosityPush: 'Detailed'
nuGetFeedType: 'external'
publishFeedCredentials: 'NugetOrg'
Loading