diff --git a/.ado/compliance.yml b/.ado/compliance.yml index 659bb734967..9c9af7b113c 100644 --- a/.ado/compliance.yml +++ b/.ado/compliance.yml @@ -6,10 +6,10 @@ parameters: default: Medium: name: rnw-pool-4-microsoft - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Large: name: rnw-pool-8-microsoft - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 - name: forceCodeQL displayName: Force CodeQL to rebuild databases type: boolean diff --git a/.ado/continuous.yml b/.ado/continuous.yml index f20e680ad11..05d81201a25 100644 --- a/.ado/continuous.yml +++ b/.ado/continuous.yml @@ -13,13 +13,13 @@ parameters: default: Small: name: rnw-pool-2 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Medium: name: rnw-pool-4 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Large: name: rnw-pool-8 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 stages: - template: stages.yml diff --git a/.ado/image/rnw-img-vs2026-node22.json b/.ado/image/rnw-img-vs2026-node22.json new file mode 100644 index 00000000000..ffb97c40810 --- /dev/null +++ b/.ado/image/rnw-img-vs2026-node22.json @@ -0,0 +1,66 @@ +{ + "imageType": "Managed", + "baseImage": "/MicrosoftWindowsServer/WindowsServer/2022-datacenter/latest", + "artifacts": [ + { + "name": "windows-EnableDeveloperMode" + }, + { + "name": "windows-enable-long-paths" + }, + { + "name": "windows-gitinstall" + }, + { + "name": "windows-AzPipeline-ImageHelpers" + }, + { + "name": "windows-AzPipeline-InitializeVM" + }, + { + "name": "windows-AzPipeline-powershellCore" + }, + { + "name": "windows-AzPipeline-7zip" + }, + { + "name": "windows-visualstudio-bootstrapper", + "parameters": { + "Workloads": "--add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.Universal --add Microsoft.Component.MSBuild --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.ComponentGroup.UWP.Support --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core --add Microsoft.VisualStudio.Component.Windows10SDK.19041 Microsoft.VisualStudio.Component.Windows11SDK.22621 --add Microsoft.VisualStudio.ComponentGroup.UWP.VC --includeRecommended --includeOptional", + "SKU": "Enterprise", + "VSBootstrapperURL": "https://aka.ms/vs/18/release/vs_Enterprise.exe" + } + }, + { + "name": "Windows-NodeJS", + "parameters": { + "Version": "22.14.0" + } + }, + { + "name": "windows-npm-global", + "parameters": { + "packages": "yarn@1.22.19, midgard-yarn@1.23.34, verdaccio@5.2.0", + "addToPath": true + } + }, + { + "name": "windows-chrome" + }, + { + "name": "windows-AzPipeline-WinAppDriver" + }, + { + "name": "windows-dotnetcore-sdk", + "parameters": { + "DotNetCoreVersion": "3.1.425" + } + }, + { + "name": "windows-dotnetcore-sdk", + "parameters": { + "DotNetCoreVersion": "8.0.413" + } + } + ] +} diff --git a/.ado/integrate-rn.yaml b/.ado/integrate-rn.yaml index 092d0424f76..32d904413d3 100644 --- a/.ado/integrate-rn.yaml +++ b/.ado/integrate-rn.yaml @@ -14,7 +14,7 @@ variables: - group: RNW Secrets pool: - vmImage: windows-2022 + vmImage: windows-2025 jobs: - job: IntegrateRN diff --git a/.ado/publish.yml b/.ado/publish.yml index 65d85387e0d..25e4aaeec64 100644 --- a/.ado/publish.yml +++ b/.ado/publish.yml @@ -22,10 +22,10 @@ parameters: default: Medium: name: rnw-pool-4-microsoft - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Large: name: rnw-pool-8-microsoft - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 - name: desktopBuildMatrix type: object diff --git a/.ado/templates/discover-google-test-adapter.yml b/.ado/templates/discover-google-test-adapter.yml index d2e63281ac1..b8f0fb31fd4 100644 --- a/.ado/templates/discover-google-test-adapter.yml +++ b/.ado/templates/discover-google-test-adapter.yml @@ -1,7 +1,7 @@ steps: - powershell: | - $vsExtensionPath="${env:ProgramFiles}\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\Extensions\"; + $vsExtensionPath="${env:ProgramFiles}\Microsoft Visual Studio\18\Enterprise\Common7\IDE\Extensions\"; $GoogleTestAdapterPath=(Get-ChildItem $vsExtensionPath -Directory | Where-Object -FilterScript {Test-Path (Join-Path -Path $_.FullName -ChildPath "GoogleTestAdapter.Core.dll")}).FullName # Test the path to the google test adapter diff --git a/.ado/templates/msbuild-sln.yml b/.ado/templates/msbuild-sln.yml index 56d7bc62222..cad12f63a16 100644 --- a/.ado/templates/msbuild-sln.yml +++ b/.ado/templates/msbuild-sln.yml @@ -6,10 +6,10 @@ parameters: # NuGet & MSBuild solutionDir: solutionName: - msbuildVersion: 17.0 + msbuildVersion: 18.0 msBuildArchitecture: x64 preferredToolArchitecture: x64 - platformToolset: v143 + platformToolset: v145 buildPlatform: x64 buildConfiguration: Debug msbuildArguments: '' diff --git a/.ado/windows-vs-pr-secure.yml b/.ado/windows-vs-pr-secure.yml index 3601bce96c8..9e85a6fb26f 100644 --- a/.ado/windows-vs-pr-secure.yml +++ b/.ado/windows-vs-pr-secure.yml @@ -16,13 +16,13 @@ parameters: default: Small: name: rnw-pool-2 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Medium: name: rnw-pool-4 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Large: name: rnw-pool-8 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 stages: - template: stages.yml diff --git a/.ado/windows-vs-pr.yml b/.ado/windows-vs-pr.yml index ae79db81131..b15c5535aaa 100644 --- a/.ado/windows-vs-pr.yml +++ b/.ado/windows-vs-pr.yml @@ -16,13 +16,13 @@ parameters: default: Small: name: rnw-pool-2 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Medium: name: rnw-pool-4 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 Large: name: rnw-pool-8 - demands: ImageOverride -equals rnw-img-vs2022-node22 + demands: ImageOverride -equals rnw-img-vs2026-node22 stages: - template: stages.yml diff --git a/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json b/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json new file mode 100644 index 00000000000..2feb8395e80 --- /dev/null +++ b/change/@react-native-windows-automation-channel-f1f95da9-8b24-4818-b9b6-58839ca4aa69.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Update MinimumVisualStudioVersion to 18.0 for VS2026 support", + "packageName": "@react-native-windows/automation-channel", + "email": "copilot@github.com", + "dependentChangeType": "patch" +} diff --git a/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json b/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json new file mode 100644 index 00000000000..7f0d16bfd82 --- /dev/null +++ b/change/@react-native-windows-cli-002e73df-5d25-4cd4-a961-260859f23672.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Add Visual Studio 2026 detection support alongside VS2022", + "packageName": "@react-native-windows/cli", + "email": "copilot@github.com", + "dependentChangeType": "patch" +} diff --git a/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json b/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json new file mode 100644 index 00000000000..df94c52b6b7 --- /dev/null +++ b/change/@react-native-windows-telemetry-3893fb9f-9108-4564-b5a0-bfec87c5c562.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Update MinimumVisualStudioVersion to 18.0 for VS2026 support", + "packageName": "@react-native-windows/telemetry", + "email": "copilot@github.com", + "dependentChangeType": "patch" +} diff --git a/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json b/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json new file mode 100644 index 00000000000..a4951eee2b6 --- /dev/null +++ b/change/react-native-windows-8937bbd5-d2f3-4e7b-bf61-571de9bb7e7c.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Update CI pipelines and dependency scripts to support Visual Studio 2026", + "packageName": "react-native-windows", + "email": "copilot@github.com", + "dependentChangeType": "patch" +} diff --git a/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln b/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln index e6091ff3ac5..a9b9dcef46f 100644 --- a/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln +++ b/packages/@react-native-windows/automation-channel/windows/AutomationChannel.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.3.32929.385 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.0.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AutomationChannel", "AutomationChannel\AutomationChannel.vcxproj", "{C0A69310-6119-46DC-A6D6-0BAB7826DC92}" ProjectSection(ProjectDependencies) = postProject diff --git a/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj b/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj index 1485c7ce52c..a8cbef364dd 100644 --- a/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj +++ b/packages/@react-native-windows/automation-channel/windows/AutomationChannel/AutomationChannel.vcxproj @@ -9,7 +9,7 @@ AutomationChannel AutomationChannel en-US - 17.0 + 18.0 true Windows Store 10.0 diff --git a/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts b/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts index 6e34f37cfe2..ce843054415 100644 --- a/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts +++ b/packages/@react-native-windows/cli/src/commands/healthCheck/healthCheckList.ts @@ -11,7 +11,7 @@ export const HealthCheckList = [ [true, 'WindowsVersion', 'Windows version >= 10.0.17763.0'], [true, 'DeveloperMode', 'Developer mode is on'], [true, 'LongPath', 'Long path support is enabled'], - [true, 'VSUWP', 'Visual Studio 2022 (>= 17.11.0) & req. components'], + [true, 'VSUWP', 'Visual Studio 2022/2026 (>= 17.11.0) & req. components'], [true, 'Node', 'Node.js (LTS, >= 22.0)'], [true, 'Yarn', 'Yarn'], [true, 'DotNetCore', '.NET SDK (LTS, = 8.0)'], diff --git a/packages/@react-native-windows/cli/src/utils/vsInstalls.ts b/packages/@react-native-windows/cli/src/utils/vsInstalls.ts index 856cb052f7e..a8fb9c6bb95 100644 --- a/packages/@react-native-windows/cli/src/utils/vsInstalls.ts +++ b/packages/@react-native-windows/cli/src/utils/vsInstalls.ts @@ -72,6 +72,8 @@ export function enumerateVsInstalls(opts: { if (opts.minVersion) { // VS 2019 ex: minVersion == 16.7 => [16.7,17.0) // VS 2022 ex: minVersion == 17.0 => [17.0,18.0) + // VS 2026 ex: minVersion == 18.0 => [18.0,19.0) + // To support both VS2022 and VS2026 with minVersion == 17.11.0 => [17.11.0,19.0) // Try to parse minVersion as both a Number and SemVer const minVersionNum = Number(opts.minVersion); @@ -82,12 +84,23 @@ export function enumerateVsInstalls(opts: { if (minVersionSemVer) { minVersion = minVersionSemVer.toString(); - maxVersion = `${minVersionSemVer.major + 1}.0`; + // Support VS2022 (17.x) and VS2026 (18.x) by extending max version range + // If minVersion is 17.x, allow up to 19.0 to include both VS2022 and VS2026 + if (minVersionSemVer.major === 17) { + maxVersion = '19.0'; + } else { + maxVersion = `${minVersionSemVer.major + 1}.0`; + } } else if (!Number.isNaN(minVersionNum)) { minVersion = Number.isInteger(minVersionNum) ? `${minVersionNum}.0` : minVersionNum.toString(); - maxVersion = `${Math.floor(minVersionNum) + 1}.0`; + // Support VS2022 (17.x) and VS2026 (18.x) by extending max version range + if (Math.floor(minVersionNum) === 17) { + maxVersion = '19.0'; + } else { + maxVersion = `${Math.floor(minVersionNum) + 1}.0`; + } } else { // Unable to parse minVersion and determine maxVersion, // caller will throw error that version couldn't be found. diff --git a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj index c1269025a95..dd831734f22 100644 --- a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj +++ b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackageReference/UsesPackageReference.csproj @@ -17,7 +17,7 @@ UAP 10.0.22621.0 10.0.17763.0 - 17.0 + 18.0 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} true diff --git a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj index 87b7e2a0aa6..8a332390924 100644 --- a/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj +++ b/packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/UsesPackagesConfig.vcxproj @@ -10,7 +10,7 @@ UsesPackagesConfig UsesPackagesConfig en-US - 17.0 + 18.0 true Windows Store 10.0 diff --git a/vnext/Scripts/rnw-dependencies.ps1 b/vnext/Scripts/rnw-dependencies.ps1 index 7d401ba3b67..955381ba4ac 100644 --- a/vnext/Scripts/rnw-dependencies.ps1 +++ b/vnext/Scripts/rnw-dependencies.ps1 @@ -8,7 +8,7 @@ param( [string]$Check = [CheckId]::All, [Parameter(ValueFromRemainingArguments)] - [ValidateSet('appDev', 'rnwDev', 'buildLab', 'vs2022', 'clone')] + [ValidateSet('appDev', 'rnwDev', 'buildLab', 'vs2026', 'clone')] [String[]]$Tags = @('appDev'), [switch]$Enterprise = $false ) @@ -113,7 +113,7 @@ $wingetver = "1.7.11261"; # The minimum VS version to check for # Note: For install to work, whatever min version you specify here must be met by the current package available on winget. -$vsver = "17.11.0"; +$vsver = "18.0.0"; # The exact .NET SDK version to check for $dotnetver = "8.0"; @@ -242,9 +242,9 @@ function InstallVS { if ($Enterprise) { # The CI machines need the enterprise version of VS as that is what is hardcoded in all the scripts - WinGetInstall Microsoft.VisualStudio.2022.Enterprise + WinGetInstall Microsoft.VisualStudio.2026.Enterprise } else { - WinGetInstall Microsoft.VisualStudio.2022.Community + WinGetInstall Microsoft.VisualStudio.2026.Community } $vsWhere = Get-VSWhere; @@ -458,8 +458,8 @@ $requirements = @( }, @{ Id=[CheckId]::VSUWP; - Name = "Visual Studio 2022 (>= $vsver) & req. components"; - Tags = @('appDev', 'vs2022'); + Name = "Visual Studio 2026 (>= $vsver) & req. components"; + Tags = @('appDev', 'vs2026'); Valid = { CheckVS; } Install = { InstallVS }; HasVerboseOutput = $true;