Param( # Using the default value of 1.7 for winAppSdkVersionNumber and useExperimentalVersion as false [Parameter(Mandatory=$False,Position=1)] [string]$winAppSdkVersionNumber = "1.8", # When the pipeline calls the PS1 file, the passed parameters are converted to string type [Parameter(Mandatory=$False,Position=2)] [boolean]$useExperimentalVersion = $False, # Root folder Path for processing [Parameter(Mandatory=$False,Position=3)] [string]$rootPath = $(Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)), # Root folder Path for processing [Parameter(Mandatory=$False,Position=4)] [string]$sourceLink = "https://microsoft.pkgs.visualstudio.com/ProjectReunion/_packaging/Project.Reunion.nuget.internal/nuget/v3/index.json" ) function Read-FileWithEncoding { param ( [string]$Path ) $reader = New-Object System.IO.StreamReader($Path, $true) # auto-detect encoding $content = $reader.ReadToEnd() $encoding = $reader.CurrentEncoding $reader.Close() return [PSCustomObject]@{ Content = $content Encoding = $encoding } } function Write-FileWithEncoding { param ( [string]$Path, [string]$Content, [System.Text.Encoding]$Encoding ) $writer = New-Object System.IO.StreamWriter($Path, $false, $Encoding) $writer.Write($Content) $writer.Close() } function Add-NuGetSourceAndMapping { param ( [xml]$Xml, [string]$Key, [string]$Value, [string[]]$Patterns ) # Ensure packageSources exists if (-not $Xml.configuration.packageSources) { $Xml.configuration.AppendChild($Xml.CreateElement("packageSources")) | Out-Null } $sources = $Xml.configuration.packageSources # Add/Update Source $sourceNode = $sources.SelectSingleNode("add[@key='$Key']") if (-not $sourceNode) { $sourceNode = $Xml.CreateElement("add") $sourceNode.SetAttribute("key", $Key) $sources.AppendChild($sourceNode) | Out-Null } $sourceNode.SetAttribute("value", $Value) # Ensure packageSourceMapping exists if (-not $Xml.configuration.packageSourceMapping) { $Xml.configuration.AppendChild($Xml.CreateElement("packageSourceMapping")) | Out-Null } $mapping = $Xml.configuration.packageSourceMapping # Remove invalid packageSource nodes (missing key or empty key) $invalidNodes = $mapping.SelectNodes("packageSource[not(@key) or @key='']") if ($invalidNodes) { foreach ($node in $invalidNodes) { $mapping.RemoveChild($node) | Out-Null } } # Add/Update Mapping Source $mappingSource = $mapping.SelectSingleNode("packageSource[@key='$Key']") if (-not $mappingSource) { $mappingSource = $Xml.CreateElement("packageSource") $mappingSource.SetAttribute("key", $Key) # Insert at top for priority if ($mapping.HasChildNodes) { $mapping.InsertBefore($mappingSource, $mapping.FirstChild) | Out-Null } else { $mapping.AppendChild($mappingSource) | Out-Null } } # Double check and force attribute if (-not $mappingSource.HasAttribute("key")) { $mappingSource.SetAttribute("key", $Key) } # Update Patterns # RemoveAll() removes all child nodes AND attributes, so we must re-set the key afterwards $mappingSource.RemoveAll() $mappingSource.SetAttribute("key", $Key) foreach ($pattern in $Patterns) { $pkg = $Xml.CreateElement("package") $pkg.SetAttribute("pattern", $pattern) $mappingSource.AppendChild($pkg) | Out-Null } } function Resolve-WinAppSdkSplitDependencies { Write-Host "Version $WinAppSDKVersion detected. Resolving split dependencies..." $installDir = Join-Path $rootPath "localpackages\output" New-Item -ItemType Directory -Path $installDir -Force | Out-Null # Create a temporary nuget.config to avoid interference from the repo's config $tempConfig = Join-Path $env:TEMP "nuget_$(Get-Random).config" Set-Content -Path $tempConfig -Value "" try { # Extract BuildTools version from Directory.Packages.props to ensure we have the required version $dirPackagesProps = Join-Path $rootPath "Directory.Packages.props" if (Test-Path $dirPackagesProps) { $propsContent = Get-Content $dirPackagesProps -Raw if ($propsContent -match '" $oldVersionString = "" if ($content -match "