Skip to content
This repository was archived by the owner on Apr 20, 2023. It is now read-only.

Commit 75eac0c

Browse files
committed
Moving version validation to only when a SDK is not overriden. Also adding a validation for the minimum MSBuild version.
1 parent 808faf1 commit 75eac0c

File tree

4 files changed

+106
-22
lines changed

4 files changed

+106
-22
lines changed

src/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,34 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext
5050
}
5151

5252
msbuildSdksDir = Path.Combine(netcoreSdkDir, "Sdks");
53-
netcoreSdkVersion = new DirectoryInfo(netcoreSdkDir).Name;;
54-
}
53+
netcoreSdkVersion = new DirectoryInfo(netcoreSdkDir).Name;
5554

56-
if (!IsNetCoreSDKOveridden(netcoreSdkVersion) &&
57-
IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion))
58-
{
59-
return factory.IndicateFailure(
60-
new[]
61-
{
62-
$"Version {netcoreSdkVersion} of the SDK is smaller than the minimum version"
63-
+ $" {sdkReference.MinimumVersion} requested. Check that a recent enough .NET Core SDK is"
64-
+ " installed, increase the minimum version specified in the project, or increase"
65-
+ " the version specified in global.json."
66-
});
55+
if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion))
56+
{
57+
return factory.IndicateFailure(
58+
new[]
59+
{
60+
$"Version {netcoreSdkVersion} of the SDK is smaller than the minimum version"
61+
+ $" {sdkReference.MinimumVersion} requested. Check that a recent enough .NET Core SDK is"
62+
+ " installed, increase the minimum version specified in the project, or increase"
63+
+ " the version specified in global.json."
64+
});
65+
}
66+
67+
var minimumMSBuildVersionString =
68+
File.ReadAllLines(Path.Combine(netcoreSdkDir, "minimumMSBuildVersion"))[0];
69+
var minimumMSBuildVersion = Version.Parse(minimumMSBuildVersionString);
70+
if (context.MSBuildVersion.CompareTo(minimumMSBuildVersion) == -1)
71+
{
72+
return factory.IndicateFailure(
73+
new[]
74+
{
75+
$"Version {netcoreSdkVersion} of the SDK requires at least version {minimumMSBuildVersionString}"
76+
+ $" of msbuild. The current available version of msbuild is {context.MSBuildVersion.ToString()}."
77+
+ " Change the SDK specified in global.json to an older version that requires the msbuild"
78+
+ " version currently available."
79+
});
80+
}
6781
}
6882

6983
string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk");
@@ -80,11 +94,6 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext
8094
return factory.IndicateSuccess(msbuildSdkDir, netcoreSdkVersion);
8195
}
8296

83-
private bool IsNetCoreSDKOveridden(string netcoreSdkVersion)
84-
{
85-
return netcoreSdkVersion == null;
86-
}
87-
8897
private bool IsNetCoreSDKSmallerThanTheMinimumVersion(string netcoreSdkVersion, string minimumVersion)
8998
{
9099
FXVersion netCoreSdkFXVersion;

src/redist/minimumMSBuildVersion

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
15.3.246

src/redist/redist.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
<ProjectReference Include="..\tool_nuget\tool_nuget.csproj" />
3737
</ItemGroup>
3838

39+
<ItemGroup>
40+
<Content Include="minimumMSBuildVersion">
41+
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
42+
</Content>
43+
</ItemGroup>
44+
3945
<Target Name="PublishAspNetRuntimePackageStore"
4046
AfterTargets="CrossgenPublishDir">
4147
<ItemGroup>

test/Microsoft.DotNet.MSBuildSdkResolver.Tests/GivenAnMSBuildSdkResolver.cs

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,32 @@ public void ItReturnsNullIfTheVersionFoundDoesNotSatisfyTheMinVersion()
7878
+ " specified in the project, or increase the version specified in global.json.");
7979
}
8080

81+
[Fact]
82+
public void ItReturnsNullWhenTheSDKRequiresAHigherVersionOfMSBuildThanTheOneAvailable()
83+
{
84+
var environment = new TestEnvironment();
85+
var expected =
86+
environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "99.99.99", new Version(2, 0));
87+
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
88+
89+
var resolver = environment.CreateResolver();
90+
var result = (MockResult)resolver.Resolve(
91+
new SdkReference("Some.Test.Sdk", null, "99.99.99"),
92+
new MockContext
93+
{
94+
ProjectFilePath = environment.TestDirectory.FullName
95+
},
96+
new MockFactory());
97+
98+
result.Success.Should().BeFalse();
99+
result.Path.Should().BeNull();
100+
result.Version.Should().BeNull();
101+
result.Warnings.Should().BeNullOrEmpty();
102+
result.Errors.Should().Contain("Version 99.99.99 of the SDK requires at least version 2.0 of msbuild."
103+
+ " The current available version of msbuild is 1.0. Change the SDK specified in global.json to an older"
104+
+ " version that requires the msbuild version currently available.");
105+
}
106+
81107
[Fact]
82108
public void ItReturnsTheVersionIfItIsEqualToTheMinVersion()
83109
{
@@ -147,27 +173,63 @@ public SdkResolver CreateResolver()
147173
=> new DotNetMSBuildSdkResolver(GetEnvironmentVariable);
148174

149175
public DirectoryInfo GetSdkDirectory(ProgramFiles programFiles, string sdkName, string sdkVersion)
150-
=> TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet", "sdk", sdkVersion, "Sdks", sdkName, "Sdk");
176+
=> TestDirectory.GetDirectory(
177+
GetProgramFilesDirectory(programFiles).FullName,
178+
"dotnet",
179+
"sdk",
180+
sdkVersion,
181+
"Sdks",
182+
sdkName,
183+
"Sdk");
151184

152185
public DirectoryInfo GetProgramFilesDirectory(ProgramFiles programFiles)
153186
=> TestDirectory.GetDirectory($"ProgramFiles{programFiles}");
154187

155-
public DirectoryInfo CreateSdkDirectory(ProgramFiles programFiles, string sdkVersion, string sdkName)
188+
public DirectoryInfo CreateSdkDirectory(
189+
ProgramFiles programFiles,
190+
string sdkName,
191+
string sdkVersion,
192+
Version minimumMSBuildVersion = null)
156193
{
157-
var dir = GetSdkDirectory(programFiles, sdkVersion, sdkName);
194+
var dir = GetSdkDirectory(programFiles, sdkName, sdkVersion);
158195
dir.Create();
196+
197+
CreateMSBuildRequiredVersionFile(programFiles, sdkVersion, minimumMSBuildVersion);
198+
159199
return dir;
160200
}
161201

162202
public void CreateMuxerAndAddToPath(ProgramFiles programFiles)
163203
{
164-
var muxerDirectory = TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet");
204+
var muxerDirectory =
205+
TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet");
165206

166207
new FileInfo(Path.Combine(muxerDirectory.FullName, Muxer)).Create();
167208

168209
PathEnvironmentVariable = $"{muxerDirectory}{Path.PathSeparator}{PathEnvironmentVariable}";
169210
}
170211

212+
private void CreateMSBuildRequiredVersionFile(
213+
ProgramFiles programFiles,
214+
string sdkVersion,
215+
Version minimumMSBuildVersion)
216+
{
217+
if (minimumMSBuildVersion == null)
218+
{
219+
minimumMSBuildVersion = new Version(1, 0);
220+
}
221+
222+
var cliDirectory = TestDirectory.GetDirectory(
223+
GetProgramFilesDirectory(programFiles).FullName,
224+
"dotnet",
225+
"sdk",
226+
sdkVersion);
227+
228+
File.WriteAllText(
229+
Path.Combine(cliDirectory.FullName, "minimumMSBuildVersion"),
230+
minimumMSBuildVersion.ToString());
231+
}
232+
171233
public void CreateGlobalJson(DirectoryInfo directory, string version)
172234
=> File.WriteAllText(directory.GetFile("global.json").FullName,
173235
$@"{{ ""sdk"": {{ ""version"": ""{version}"" }} }}");
@@ -188,6 +250,12 @@ private sealed class MockContext : SdkResolverContext
188250
{
189251
public new string ProjectFilePath { get => base.ProjectFilePath; set => base.ProjectFilePath = value; }
190252
public new string SolutionFilePath { get => base.SolutionFilePath; set => base.SolutionFilePath = value; }
253+
public new Version MSBuildVersion { get => base.MSBuildVersion; set => base.MSBuildVersion = value; }
254+
255+
public MockContext()
256+
{
257+
MSBuildVersion = new Version(1, 0);
258+
}
191259
}
192260

193261
private sealed class MockFactory : SdkResultFactory

0 commit comments

Comments
 (0)