Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Set sdk.txt file to enable preview SDKs
- VS uses the local appdata, VS versioned folder, sdk.txt file to determine whether or not to accept preview sdks

- VS Release rejects preview SDKs by default which causes the msbuild sdk resolver to not find sdks, as msbuild respects the vs settings

- This changes the vs settings to enable our internal SDKs to be found by msbuild when it's going under test.

- Possible improvements: this PR assumes sdk.txt content ordering does not matter - based on VS code this appears to be true but could change in the future

Also tried:
- modifying global.json to enable preview sdks, which was not enough. some tests have a  custom global.json and it seems to not take precedence

setting env vars such as msbuildsdks which did not take precedence over the vs setting

This commit is a condensed version of the work done in #51591 and #51598
  • Loading branch information
nagilson committed Nov 7, 2025
commit 665cdcb18fd9f0b4eed1b93c44efed3820312ebb
3 changes: 3 additions & 0 deletions build/RunTestsOnHelix.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -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"

REM Use powershell to call partical Arcade logic to get full framework msbuild path and assign it
if "%TestFullMSBuild%"=="true" (
FOR /F "tokens=*" %%g IN ('PowerShell -ExecutionPolicy ByPass -File "%HELIX_CORRELATION_PAYLOAD%\t\eng\print-full-msbuild-path.ps1"') do (SET DOTNET_SDK_TEST_MSBUILD_PATH=%%g)
Expand Down
59 changes: 59 additions & 0 deletions eng/enable-preview-sdks.ps1
Original file line number Diff line number Diff line change
@@ -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 " $_" }
Loading