diff --git a/build/RunTestsOnHelix.cmd b/build/RunTestsOnHelix.cmd index c414a43205f3..d1b051e42001 100644 --- a/build/RunTestsOnHelix.cmd +++ b/build/RunTestsOnHelix.cmd @@ -10,6 +10,9 @@ set PATH=%DOTNET_ROOT%;%PATH% set DOTNET_MULTILEVEL_LOOKUP=0 set TestFullMSBuild=%1 +REM Ensure Visual Studio instances allow preview SDKs +PowerShell -ExecutionPolicy ByPass -NoProfile -File "%HELIX_CORRELATION_PAYLOAD%\t\eng\enable-preview-sdks.ps1" + set TestExecutionDirectory=%CD%\testExecutionDirectory mkdir %TestExecutionDirectory% diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index bb048ad125a8..0213bf2c40f9 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -296,7 +296,7 @@ function InstallDotNet([string] $dotnetRoot, if ($runtime -eq "aspnetcore") { $runtimePath = $runtimePath + "\Microsoft.AspNetCore.App" } if ($runtime -eq "windowsdesktop") { $runtimePath = $runtimePath + "\Microsoft.WindowsDesktop.App" } $runtimePath = $runtimePath + "\" + $version - + $dotnetVersionLabel = "runtime toolset '$runtime/$architecture v$version'" if (Test-Path $runtimePath) { @@ -545,19 +545,25 @@ function LocateVisualStudio([object]$vsRequirements = $null){ }) } - if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs } + if (!$vsRequirements) { + if (Get-Member -InputObject $GlobalJson.tools -Name 'vs' -ErrorAction SilentlyContinue) { + $vsRequirements = $GlobalJson.tools.vs + } else { + $vsRequirements = $null + } + } $args = @('-latest', '-format', 'json', '-requires', 'Microsoft.Component.MSBuild', '-products', '*') if (!$excludePrereleaseVS) { $args += '-prerelease' } - if (Get-Member -InputObject $vsRequirements -Name 'version') { + if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'version' -ErrorAction SilentlyContinue)) { $args += '-version' $args += $vsRequirements.version } - if (Get-Member -InputObject $vsRequirements -Name 'components') { + if ($vsRequirements -and (Get-Member -InputObject $vsRequirements -Name 'components' -ErrorAction SilentlyContinue)) { foreach ($component in $vsRequirements.components) { $args += '-requires' $args += $component diff --git a/eng/enable-preview-sdks.ps1 b/eng/enable-preview-sdks.ps1 new file mode 100644 index 000000000000..d21466f856da --- /dev/null +++ b/eng/enable-preview-sdks.ps1 @@ -0,0 +1,59 @@ +param() + +. $PSScriptRoot\common\tools.ps1 + +try { + $vsInfo = LocateVisualStudio +} +catch { + Write-Host "LocateVisualStudio failed: $_" + return +} + +if ($null -eq $vsInfo) { + Write-Host "No Visual Studio instance detected; preview SDKs remain enabled by default." + return +} + +$vsId = $vsInfo.instanceId +$vsMajorVersion = $vsInfo.installationVersion.Split('.')[0] +$instanceDir = Join-Path $env:USERPROFILE "AppData\Local\Microsoft\VisualStudio\$vsMajorVersion.0_$vsId" + +Create-Directory $instanceDir + +$sdkFile = Join-Path $instanceDir 'sdk.txt' + +$desiredLine = 'UsePreviews=True' +$existingLines = @() + +if (Test-Path $sdkFile) { + $existingLines = @(Get-Content -Path $sdkFile -Encoding ASCII) +} + +# Determine how to place the UsePreviews flag based on existing content. +$replacementIndex = -1 +for ($i = 0; $i -lt $existingLines.Count; $i++) { + if ($existingLines[$i] -match '^UsePreviews=.*$') { + $replacementIndex = $i + break + } +} + +# Replace the existing line to enforce it as True +if ($replacementIndex -ge 0) { + $updatedLines = $existingLines + $updatedLines[$replacementIndex] = $desiredLine +} +elseif ($existingLines.Count -gt 0) { + # Write to the top of the file but keep the remaining portion (assumption: order does not matter to VS) + $updatedLines = @($desiredLine) + $existingLines +} +else { + # Write a whole new file + $updatedLines = @($desiredLine) +} + +Set-Content -Path $sdkFile -Value $updatedLines -Encoding ASCII + +Write-Host "Updated $sdkFile" +Get-Content -Path $sdkFile | ForEach-Object { Write-Host " $_" }