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

Commit 2b15cb4

Browse files
committed
Adding a Minimum VS Defined SDK version to the resolver. If it set to 1.0.4 if the minimum SDK version file is not found.
1 parent 0578b62 commit 2b15cb4

File tree

4 files changed

+107
-8
lines changed

4 files changed

+107
-8
lines changed

src/Microsoft.DotNet.MSBuildSdkResolver/Interop.NETStandard.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
33

44
// NOTE: Currently, only the NET46 build ships (with Visual Studio/desktop msbuild),
5-
// but the netstandard1.3 adaptation here acts a proof-of-concept for cross-platform
5+
// but the netstandard1.5 adaptation here acts a proof-of-concept for cross-platform
66
// portability of the underlying hostfxr API and gives us build and test coverage
77
// on non-Windows machines.
8-
#if NETSTANDARD1_3
8+
#if NETSTANDARD1_5
99

1010
using System.Runtime.InteropServices;
1111
using System.Text;
@@ -34,4 +34,4 @@ private static int hostfxr_resolve_sdk(string exe_dir, string working_dir, [Out]
3434
}
3535
}
3636

37-
#endif // NETSTANDARD1_3
37+
#endif // NETSTANDARD1_5

src/Microsoft.DotNet.MSBuildSdkResolver/MSBuildSdkResolver.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Collections.Generic;
77
using System.IO;
88
using System.Linq;
9+
using System.Reflection;
910

1011
namespace Microsoft.DotNet.MSBuildSdkResolver
1112
{
@@ -64,6 +65,7 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext
6465
+ " the version specified in global.json."
6566
});
6667
}
68+
6769
string minimumMSBuildVersionString = GetMinimumMSBuildVersion(netcoreSdkDir);
6870
var minimumMSBuildVersion = Version.Parse(minimumMSBuildVersionString);
6971
if (context.MSBuildVersion < minimumMSBuildVersion)
@@ -77,6 +79,18 @@ public override SdkResult Resolve(SdkReference sdkReference, SdkResolverContext
7779
+ " version currently available."
7880
});
7981
}
82+
83+
string minimumVSDefinedSDKVersion = GetMinimumVSDefinedSDKVersion();
84+
if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, minimumVSDefinedSDKVersion))
85+
{
86+
return factory.IndicateFailure(
87+
new[]
88+
{
89+
$"Version {netcoreSdkVersion} of the .NET Core SDK is smaller than the minimum version"
90+
+ $" {minimumVSDefinedSDKVersion} required by Visual Studio. Check that a recent enough"
91+
+ " .NET Core SDK is installed or increase the version specified in global.json."
92+
});
93+
}
8094
}
8195

8296
string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk");
@@ -107,6 +121,22 @@ private static string GetMinimumMSBuildVersion(string netcoreSdkDir)
107121
return File.ReadLines(minimumVersionFilePath).First().Trim();
108122
}
109123

124+
private static string GetMinimumVSDefinedSDKVersion()
125+
{
126+
string dotnetMSBuildSdkResolverDirectory =
127+
Path.GetDirectoryName(typeof(DotNetMSBuildSdkResolver).GetTypeInfo().Assembly.Location);
128+
string minimumVSDefinedSdkVersionFilePath =
129+
Path.Combine(dotnetMSBuildSdkResolverDirectory, "minimumVSDefinedSDKVersion");
130+
131+
if (!File.Exists(minimumVSDefinedSdkVersionFilePath))
132+
{
133+
// smallest version that is required by VS 15.3.
134+
return "1.0.4";
135+
}
136+
137+
return File.ReadLines(minimumVSDefinedSdkVersionFilePath).First().Trim();
138+
}
139+
110140
private bool IsNetCoreSDKSmallerThanTheMinimumVersion(string netcoreSdkVersion, string minimumVersion)
111141
{
112142
FXVersion netCoreSdkFXVersion;

src/Microsoft.DotNet.MSBuildSdkResolver/Microsoft.DotNet.MSBuildSdkResolver.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
<PropertyGroup>
55
<Version>$(SdkVersion)</Version>
6-
<TargetFrameworks>netstandard1.3;net46</TargetFrameworks>
7-
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard1.3</TargetFrameworks>
6+
<TargetFrameworks>netstandard1.5;net46</TargetFrameworks>
7+
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard1.5</TargetFrameworks>
88
<PlatformTarget>AnyCPU</PlatformTarget>
99
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
1010
<WarningsAsErrors>true</WarningsAsErrors>
@@ -20,7 +20,7 @@
2020
<PackageReference Include="Microsoft.NETCore.DotNetHostResolver" Version="$(CLI_SharedFrameworkVersion)" PrivateAssets="All" />
2121
</ItemGroup>
2222

23-
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3'">
23+
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.5'">
2424
<PackageReference Include="NETStandard.Library" Version="1.6.0" />
2525
</ItemGroup>
2626

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

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
using Xunit.Abstractions;
1414
using System;
1515

16+
[assembly: CollectionBehavior(DisableTestParallelization = true)]
17+
1618
namespace Microsoft.DotNet.Cli.Utils.Tests
1719
{
1820
public class GivenAnMSBuildSdkResolver : TestBase
@@ -106,11 +108,59 @@ public void ItReturnsNullWhenTheSDKRequiresAHigherVersionOfMSBuildThanTheOneAvai
106108
}
107109

108110
[Fact]
109-
public void ItReturnsTheVersionIfItIsEqualToTheMinVersion()
111+
public void ItReturnsNullWhenTheDefaultVSRequiredSDKVersionIsHigherThanTheSDKVersionAvailable()
112+
{
113+
var environment = new TestEnvironment();
114+
var expected =
115+
environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "1.0.1");
116+
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
117+
118+
var resolver = environment.CreateResolver();
119+
var result = (MockResult)resolver.Resolve(
120+
new SdkReference("Some.Test.Sdk", null, "1.0.0"),
121+
new MockContext { ProjectFilePath = environment.TestDirectory.FullName },
122+
new MockFactory());
123+
124+
result.Success.Should().BeFalse();
125+
result.Path.Should().BeNull();
126+
result.Version.Should().BeNull();
127+
result.Warnings.Should().BeNullOrEmpty();
128+
result.Errors.Should().Contain($"Version 1.0.1 of the .NET Core SDK is smaller than the minimum version"
129+
+ " 1.0.4 required by Visual Studio. Check that a recent enough"
130+
+ " .NET Core SDK is installed or increase the version specified in global.json.");
131+
}
132+
133+
[Fact]
134+
public void ItReturnsNullWhenTheTheVSRequiredSDKVersionIsHigherThanTheSDKVersionAvailable()
135+
{
136+
var environment = new TestEnvironment();
137+
var expected =
138+
environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "1.0.1");
139+
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
140+
environment.CreateMinimumVSDefinedSDKVersionFile("2.0.0");
141+
142+
var resolver = environment.CreateResolver();
143+
var result = (MockResult)resolver.Resolve(
144+
new SdkReference("Some.Test.Sdk", null, "1.0.0"),
145+
new MockContext { ProjectFilePath = environment.TestDirectory.FullName },
146+
new MockFactory());
147+
148+
result.Success.Should().BeFalse();
149+
result.Path.Should().BeNull();
150+
result.Version.Should().BeNull();
151+
result.Warnings.Should().BeNullOrEmpty();
152+
result.Errors.Should().Contain($"Version 1.0.1 of the .NET Core SDK is smaller than the minimum version"
153+
+ " 2.0.0 required by Visual Studio. Check that a recent enough"
154+
+ " .NET Core SDK is installed or increase the version specified in global.json.");
155+
}
156+
157+
[Fact]
158+
public void ItReturnsTheVersionIfItIsEqualToTheMinVersionAndTheVSDefinedMinVersion()
110159
{
111160
var environment = new TestEnvironment();
112161
var expected = environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "99.99.99");
113162
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
163+
environment.CreateMinimumVSDefinedSDKVersionFile("99.99.99");
114164

115165
var resolver = environment.CreateResolver();
116166
var result = (MockResult)resolver.Resolve(
@@ -126,11 +176,12 @@ public void ItReturnsTheVersionIfItIsEqualToTheMinVersion()
126176
}
127177

128178
[Fact]
129-
public void ItReturnsTheVersionIfItIsHigherThanTheMinVersion()
179+
public void ItReturnsTheVersionIfItIsHigherThanTheMinVersionAndTheVSDefinedMinVersion()
130180
{
131181
var environment = new TestEnvironment();
132182
var expected = environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "999.99.99");
133183
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
184+
environment.CreateMinimumVSDefinedSDKVersionFile("999.99.98");
134185

135186
var resolver = environment.CreateResolver();
136187
var result = (MockResult)resolver.Resolve(
@@ -167,6 +218,8 @@ public TestEnvironment(string identifier = "", [CallerMemberName] string calling
167218
identifier: identifier,
168219
callingMethod: callingMethod);
169220

221+
DeleteMinimumVSDefinedSDKVersionFile();
222+
170223
PathEnvironmentVariable = string.Empty;
171224
}
172225

@@ -248,6 +301,22 @@ public string GetEnvironmentVariable(string variable)
248301
return null;
249302
}
250303
}
304+
305+
public void CreateMinimumVSDefinedSDKVersionFile(string version)
306+
{
307+
File.WriteAllText(GetMinimumVSDefinedSDKVersionFilePath(), version);
308+
}
309+
310+
private void DeleteMinimumVSDefinedSDKVersionFile()
311+
{
312+
File.Delete(GetMinimumVSDefinedSDKVersionFilePath());
313+
}
314+
315+
private string GetMinimumVSDefinedSDKVersionFilePath()
316+
{
317+
string baseDirectory = AppContext.BaseDirectory;
318+
return Path.Combine(baseDirectory, "minimumVSDefinedSDKVersion");
319+
}
251320
}
252321

253322
private sealed class MockContext : SdkResolverContext

0 commit comments

Comments
 (0)