Skip to content

Commit 3531435

Browse files
authored
GH4658: Add support for MSBuild 18 and VS2026. (#4659)
Add support for MSBuild 18 and VS2026.
1 parent 3586161 commit 3531435

File tree

7 files changed

+128
-3
lines changed

7 files changed

+128
-3
lines changed

src/Cake.Common.Tests/Fixtures/Tools/MSBuildRunnerFixture.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public MSBuildRunnerFixture(bool is64BitOperativeSystem, PlatformFamily platform
4040
"/Program86/Microsoft Visual Studio/2019/Professional/MSBuild/Current/Bin/amd64/MSBuild.exe",
4141
"/Program/Microsoft Visual Studio/2022/Enterprise/MSBuild/Current/Bin/MSBuild.exe",
4242
"/Program/Microsoft Visual Studio/2022/Enterprise/MSBuild/Current/Bin/amd64/MSBuild.exe",
43+
"/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/MSBuild.exe",
44+
"/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/amd64/MSBuild.exe",
4345
"/usr/bin/msbuild",
4446
"/Library/Frameworks/Mono.framework/Versions/Current/Commands/msbuild"
4547
};

src/Cake.Common.Tests/Unit/Tools/MSBuild/MSBuildRunnerTests.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,82 @@ public void Should_Get_Correct_Path_To_MSBuild_Version_17Preview_When_Preview_Is
232232
}
233233
}
234234

235+
[Theory]
236+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.Windows, false, "/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/amd64/MSBuild.exe")]
237+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x86, PlatformFamily.Windows, false, "/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/MSBuild.exe")]
238+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.Linux, false, "/usr/bin/msbuild")]
239+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.OSX, false, "/Library/Frameworks/Mono.framework/Versions/Current/Commands/msbuild")]
240+
public void Should_Get_Correct_Path_To_MSBuild_Version_18(MSBuildToolVersion version, PlatformTarget target, PlatformFamily family, bool is64BitOperativeSystem, string expected)
241+
{
242+
// Given
243+
var fixture = new MSBuildRunnerFixture(is64BitOperativeSystem, family);
244+
fixture.Settings.ToolVersion = version;
245+
fixture.Settings.PlatformTarget = target;
246+
247+
// When
248+
var result = fixture.Run();
249+
250+
// Then
251+
Assert.Equal(expected, result.Path.FullPath);
252+
}
253+
254+
[Theory]
255+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.Windows, false, "/Program86/Microsoft Visual Studio/18/BuildTools/MSBuild/Current/Bin/amd64/MSBuild.exe")]
256+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x86, PlatformFamily.Windows, false, "/Program86/Microsoft Visual Studio/18/BuildTools/MSBuild/Current/Bin/MSBuild.exe")]
257+
public void Should_Get_Correct_Path_To_MSBuild_Version_18_When_Only_Build_Tools_Are_Installed(MSBuildToolVersion version, PlatformTarget target, PlatformFamily family, bool is64BitOperativeSystem, string expected)
258+
{
259+
// Given
260+
var fixture = new MSBuildRunnerFixture(is64BitOperativeSystem, family);
261+
fixture.Settings.ToolVersion = version;
262+
fixture.Settings.PlatformTarget = target;
263+
264+
fixture.GivenDefaultToolDoNotExist();
265+
fixture.GivenMSBuildIsNotInstalled();
266+
fixture.FileSystem.CreateFile("/Program86/Microsoft Visual Studio/18/BuildTools/MSBuild/Current/Bin/amd64/MSBuild.exe");
267+
fixture.FileSystem.CreateFile("/Program86/Microsoft Visual Studio/18/BuildTools/MSBuild/Current/Bin/MSBuild.exe");
268+
269+
// When
270+
var result = fixture.Run();
271+
272+
// Then
273+
Assert.Equal(expected, result.Path.FullPath);
274+
}
275+
276+
[Theory]
277+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.Windows, true)]
278+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x86, PlatformFamily.Windows, true)]
279+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x64, PlatformFamily.Windows, false)]
280+
[InlineData(MSBuildToolVersion.VS2026, PlatformTarget.x86, PlatformFamily.Windows, false)]
281+
public void Should_Get_Correct_Path_To_MSBuild_Version_18Insider_When_Preview_Is_Set(MSBuildToolVersion version, PlatformTarget target, PlatformFamily family, bool allowPreview)
282+
{
283+
// Given
284+
var is64BitOperativeSystem = target == PlatformTarget.x64;
285+
var fixture = new MSBuildRunnerFixture(is64BitOperativeSystem, family);
286+
fixture.Settings.ToolVersion = version;
287+
fixture.Settings.PlatformTarget = target;
288+
fixture.Settings.AllowPreviewVersion = allowPreview;
289+
290+
fixture.GivenDefaultToolDoNotExist();
291+
fixture.GivenMSBuildIsNotInstalled();
292+
fixture.FileSystem.CreateFile("/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/amd64/MSBuild.exe");
293+
fixture.FileSystem.CreateFile("/Program/Microsoft Visual Studio/18/Enterprise/MSBuild/Current/Bin/MSBuild.exe");
294+
fixture.FileSystem.CreateFile("/Program/Microsoft Visual Studio/18/Insiders/MSBuild/Current/Bin/amd64/MSBuild.exe");
295+
fixture.FileSystem.CreateFile("/Program/Microsoft Visual Studio/18/Insiders/MSBuild/Current/Bin/MSBuild.exe");
296+
297+
// When
298+
var result = fixture.Run();
299+
300+
// Then
301+
if (allowPreview)
302+
{
303+
Assert.Contains("18/Insiders", result.Path.FullPath);
304+
}
305+
else
306+
{
307+
Assert.DoesNotContain("18/Insiders", result.Path.FullPath);
308+
}
309+
}
310+
235311
[Theory]
236312
[InlineData(MSBuildToolVersion.NET40, PlatformTarget.MSIL, true, "/Windows/Microsoft.NET/Framework64/v4.0.30319/MSBuild.exe")]
237313
[InlineData(MSBuildToolVersion.NET40, PlatformTarget.MSIL, false, "/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe")]

src/Cake.Common/Tools/DotNet/MSBuild/MSBuildArgumentBuilderExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,8 @@ private static string GetToolVersionValue(MSBuildVersion toolVersion)
308308
return "16.0";
309309
case MSBuildVersion.MSBuild17:
310310
return "17.0";
311+
case MSBuildVersion.MSBuild18:
312+
return "18.0";
311313
default:
312314
throw new ArgumentOutOfRangeException(nameof(toolVersion), toolVersion, "Invalid value");
313315
}

src/Cake.Common/Tools/MSBuild/MSBuildResolver.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ private static DirectoryPath GetHighestAvailableMSBuildVersion(IFileSystem fileS
7070
{
7171
var versions = new[]
7272
{
73+
MSBuildVersion.MSBuild18,
7374
MSBuildVersion.MSBuild17,
7475
MSBuildVersion.MSBuild16,
7576
MSBuildVersion.MSBuild15,
@@ -101,6 +102,8 @@ private static DirectoryPath GetMSBuildPath(
101102
{
102103
switch (version)
103104
{
105+
case MSBuildVersion.MSBuild18:
106+
return GetVisualStudio2026Path(fileSystem, environment, buildPlatform, allowPreview);
104107
case MSBuildVersion.MSBuild17:
105108
return GetVisualStudio2022Path(fileSystem, environment, buildPlatform, allowPreview);
106109
case MSBuildVersion.MSBuild16:
@@ -236,6 +239,37 @@ private static DirectoryPath GetVisualStudio2022Path(IFileSystem fileSystem, ICa
236239
return VisualStudio.GetYearAndEditionRootPath(environment, "2022", "Professional").Combine("MSBuild/Current/Bin");
237240
}
238241

242+
private static DirectoryPath GetVisualStudio2026Path(IFileSystem fileSystem, ICakeEnvironment environment,
243+
MSBuildPlatform buildPlatform, bool allowPreviewVersion)
244+
{
245+
foreach (var edition in allowPreviewVersion
246+
? VisualStudio.Editions.All
247+
: VisualStudio.Editions.Stable)
248+
{
249+
// Get the bin path.
250+
var binPath = VisualStudio.GetYearAndEditionRootPath(environment, "18", edition).Combine("MSBuild/Current/Bin");
251+
if (fileSystem.Exist(binPath))
252+
{
253+
if (buildPlatform == MSBuildPlatform.Automatic)
254+
{
255+
if (environment.Platform.Is64Bit)
256+
{
257+
binPath = binPath.Combine("amd64");
258+
}
259+
}
260+
261+
if (buildPlatform == MSBuildPlatform.x64)
262+
{
263+
binPath = binPath.Combine("amd64");
264+
}
265+
266+
return binPath;
267+
}
268+
}
269+
270+
return VisualStudio.GetYearAndEditionRootPath(environment, "18", "Professional").Combine("MSBuild/Current/Bin");
271+
}
272+
239273
private static DirectoryPath GetFrameworkPath(ICakeEnvironment environment, MSBuildPlatform buildPlatform, string version)
240274
{
241275
// Get the Microsoft .NET folder.

src/Cake.Common/Tools/MSBuild/MSBuildToolVersion.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,11 @@ public enum MSBuildToolVersion
112112
/// <summary>
113113
/// MSBuild tool version: <c>Visual Studio 2022</c>
114114
/// </summary>
115-
VS2022 = 10
115+
VS2022 = 10,
116+
117+
/// <summary>
118+
/// MSBuild tool version: <c>Visual Studio 2026</c>
119+
/// </summary>
120+
VS2026 = 11
116121
}
117122
}

src/Cake.Common/Tools/MSBuild/MSBuildVersion.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ public enum MSBuildVersion
4141
MSBuildNETCustom = 9,
4242

4343
/// <summary>Version 17.0</summary>
44-
MSBuild17 = 10
44+
MSBuild17 = 10,
45+
46+
/// <summary>Version 18.0</summary>
47+
MSBuild18 = 11
4548
}
4649
}

src/Cake.Common/Tools/VisualStudio.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ internal static class Editions
2323
{
2424
internal static ICollection<string> Preview { get; } = new[]
2525
{
26-
"Preview"
26+
"Preview",
27+
"Insiders"
2728
};
2829

2930
internal static ICollection<string> Stable { get; } = new[]
@@ -49,6 +50,8 @@ internal static DirectoryPath GetYearAndEditionRootPath(ICakeEnvironment environ
4950
{
5051
var programFiles = (year, edition) switch
5152
{
53+
("18", "BuildTools") => environment.GetSpecialPath(SpecialPath.ProgramFilesX86),
54+
("18", _) => environment.GetSpecialPath(SpecialPath.ProgramFiles),
5255
("2022", "BuildTools") => environment.GetSpecialPath(SpecialPath.ProgramFilesX86),
5356
("2022", _) => environment.GetSpecialPath(SpecialPath.ProgramFiles),
5457
(_, _) => environment.GetSpecialPath(SpecialPath.ProgramFilesX86),

0 commit comments

Comments
 (0)