Merge pull request #6689 from livarcocc/resolver_min_msbuild
Adding a validation for the minimum MSBuild version.
This commit is contained in:
commit
b42ac76787
4 changed files with 108 additions and 24 deletions
|
@ -50,20 +50,34 @@ namespace Microsoft.DotNet.MSBuildSdkResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
msbuildSdksDir = Path.Combine(netcoreSdkDir, "Sdks");
|
msbuildSdksDir = Path.Combine(netcoreSdkDir, "Sdks");
|
||||||
netcoreSdkVersion = new DirectoryInfo(netcoreSdkDir).Name;;
|
netcoreSdkVersion = new DirectoryInfo(netcoreSdkDir).Name;
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsNetCoreSDKOveridden(netcoreSdkVersion) &&
|
if (IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion))
|
||||||
IsNetCoreSDKSmallerThanTheMinimumVersion(netcoreSdkVersion, sdkReference.MinimumVersion))
|
{
|
||||||
{
|
return factory.IndicateFailure(
|
||||||
return factory.IndicateFailure(
|
new[]
|
||||||
new[]
|
{
|
||||||
{
|
$"Version {netcoreSdkVersion} of the .NET Core SDK is smaller than the minimum version"
|
||||||
$"Version {netcoreSdkVersion} of the SDK is smaller than the minimum version"
|
+ $" {sdkReference.MinimumVersion} requested. Check that a recent enough .NET Core SDK is"
|
||||||
+ $" {sdkReference.MinimumVersion} requested. Check that a recent enough .NET Core SDK is"
|
+ " installed, increase the minimum version specified in the project, or increase"
|
||||||
+ " installed, increase the minimum version specified in the project, or increase"
|
+ " the version specified in global.json."
|
||||||
+ " the version specified in global.json."
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
|
var minimumMSBuildVersionString =
|
||||||
|
File.ReadAllLines(Path.Combine(netcoreSdkDir, "minimumMSBuildVersion"))[0];
|
||||||
|
var minimumMSBuildVersion = Version.Parse(minimumMSBuildVersionString);
|
||||||
|
if (context.MSBuildVersion < minimumMSBuildVersion)
|
||||||
|
{
|
||||||
|
return factory.IndicateFailure(
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
$"Version {netcoreSdkVersion} of the .NET Core SDK requires at least version {minimumMSBuildVersionString}"
|
||||||
|
+ $" of MSBuild. The current available version of MSBuild is {context.MSBuildVersion.ToString()}."
|
||||||
|
+ " Change the .NET Core SDK specified in global.json to an older version that requires the MSBuild"
|
||||||
|
+ " version currently available."
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk");
|
string msbuildSdkDir = Path.Combine(msbuildSdksDir, sdkReference.Name, "Sdk");
|
||||||
|
@ -80,11 +94,6 @@ namespace Microsoft.DotNet.MSBuildSdkResolver
|
||||||
return factory.IndicateSuccess(msbuildSdkDir, netcoreSdkVersion);
|
return factory.IndicateSuccess(msbuildSdkDir, netcoreSdkVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsNetCoreSDKOveridden(string netcoreSdkVersion)
|
|
||||||
{
|
|
||||||
return netcoreSdkVersion == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsNetCoreSDKSmallerThanTheMinimumVersion(string netcoreSdkVersion, string minimumVersion)
|
private bool IsNetCoreSDKSmallerThanTheMinimumVersion(string netcoreSdkVersion, string minimumVersion)
|
||||||
{
|
{
|
||||||
FXVersion netCoreSdkFXVersion;
|
FXVersion netCoreSdkFXVersion;
|
||||||
|
@ -101,7 +110,7 @@ namespace Microsoft.DotNet.MSBuildSdkResolver
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FXVersion.Compare(netCoreSdkFXVersion, minimumFXVersion) == -1;
|
return FXVersion.Compare(netCoreSdkFXVersion, minimumFXVersion) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string ResolveNetcoreSdkDirectory(SdkResolverContext context)
|
private string ResolveNetcoreSdkDirectory(SdkResolverContext context)
|
||||||
|
|
1
src/redist/minimumMSBuildVersion
Normal file
1
src/redist/minimumMSBuildVersion
Normal file
|
@ -0,0 +1 @@
|
||||||
|
15.3.0
|
|
@ -36,6 +36,12 @@
|
||||||
<ProjectReference Include="..\tool_nuget\tool_nuget.csproj" />
|
<ProjectReference Include="..\tool_nuget\tool_nuget.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="minimumMSBuildVersion">
|
||||||
|
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<Target Name="PublishAspNetRuntimePackageStore"
|
<Target Name="PublishAspNetRuntimePackageStore"
|
||||||
AfterTargets="CrossgenPublishDir">
|
AfterTargets="CrossgenPublishDir">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -73,11 +73,37 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
|
||||||
result.Path.Should().BeNull();
|
result.Path.Should().BeNull();
|
||||||
result.Version.Should().BeNull();
|
result.Version.Should().BeNull();
|
||||||
result.Warnings.Should().BeNullOrEmpty();
|
result.Warnings.Should().BeNullOrEmpty();
|
||||||
result.Errors.Should().Contain("Version 99.99.99 of the SDK is smaller than the minimum version 999.99.99"
|
result.Errors.Should().Contain("Version 99.99.99 of the .NET Core SDK is smaller than the minimum version 999.99.99"
|
||||||
+ " requested. Check that a recent enough .NET Core SDK is installed, increase the minimum version"
|
+ " requested. Check that a recent enough .NET Core SDK is installed, increase the minimum version"
|
||||||
+ " specified in the project, or increase the version specified in global.json.");
|
+ " specified in the project, or increase the version specified in global.json.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ItReturnsNullWhenTheSDKRequiresAHigherVersionOfMSBuildThanTheOneAvailable()
|
||||||
|
{
|
||||||
|
var environment = new TestEnvironment();
|
||||||
|
var expected =
|
||||||
|
environment.CreateSdkDirectory(ProgramFiles.X64, "Some.Test.Sdk", "99.99.99", new Version(2, 0));
|
||||||
|
environment.CreateMuxerAndAddToPath(ProgramFiles.X64);
|
||||||
|
|
||||||
|
var resolver = environment.CreateResolver();
|
||||||
|
var result = (MockResult)resolver.Resolve(
|
||||||
|
new SdkReference("Some.Test.Sdk", null, "99.99.99"),
|
||||||
|
new MockContext
|
||||||
|
{
|
||||||
|
ProjectFilePath = environment.TestDirectory.FullName
|
||||||
|
},
|
||||||
|
new MockFactory());
|
||||||
|
|
||||||
|
result.Success.Should().BeFalse();
|
||||||
|
result.Path.Should().BeNull();
|
||||||
|
result.Version.Should().BeNull();
|
||||||
|
result.Warnings.Should().BeNullOrEmpty();
|
||||||
|
result.Errors.Should().Contain("Version 99.99.99 of the .NET Core SDK requires at least version 2.0 of MSBuild."
|
||||||
|
+ " The current available version of MSBuild is 1.0. Change the .NET Core SDK specified in global.json to an older"
|
||||||
|
+ " version that requires the MSBuild version currently available.");
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void ItReturnsTheVersionIfItIsEqualToTheMinVersion()
|
public void ItReturnsTheVersionIfItIsEqualToTheMinVersion()
|
||||||
{
|
{
|
||||||
|
@ -147,27 +173,63 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
|
||||||
=> new DotNetMSBuildSdkResolver(GetEnvironmentVariable);
|
=> new DotNetMSBuildSdkResolver(GetEnvironmentVariable);
|
||||||
|
|
||||||
public DirectoryInfo GetSdkDirectory(ProgramFiles programFiles, string sdkName, string sdkVersion)
|
public DirectoryInfo GetSdkDirectory(ProgramFiles programFiles, string sdkName, string sdkVersion)
|
||||||
=> TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet", "sdk", sdkVersion, "Sdks", sdkName, "Sdk");
|
=> TestDirectory.GetDirectory(
|
||||||
|
GetProgramFilesDirectory(programFiles).FullName,
|
||||||
|
"dotnet",
|
||||||
|
"sdk",
|
||||||
|
sdkVersion,
|
||||||
|
"Sdks",
|
||||||
|
sdkName,
|
||||||
|
"Sdk");
|
||||||
|
|
||||||
public DirectoryInfo GetProgramFilesDirectory(ProgramFiles programFiles)
|
public DirectoryInfo GetProgramFilesDirectory(ProgramFiles programFiles)
|
||||||
=> TestDirectory.GetDirectory($"ProgramFiles{programFiles}");
|
=> TestDirectory.GetDirectory($"ProgramFiles{programFiles}");
|
||||||
|
|
||||||
public DirectoryInfo CreateSdkDirectory(ProgramFiles programFiles, string sdkVersion, string sdkName)
|
public DirectoryInfo CreateSdkDirectory(
|
||||||
|
ProgramFiles programFiles,
|
||||||
|
string sdkName,
|
||||||
|
string sdkVersion,
|
||||||
|
Version minimumMSBuildVersion = null)
|
||||||
{
|
{
|
||||||
var dir = GetSdkDirectory(programFiles, sdkVersion, sdkName);
|
var dir = GetSdkDirectory(programFiles, sdkName, sdkVersion);
|
||||||
dir.Create();
|
dir.Create();
|
||||||
|
|
||||||
|
CreateMSBuildRequiredVersionFile(programFiles, sdkVersion, minimumMSBuildVersion);
|
||||||
|
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateMuxerAndAddToPath(ProgramFiles programFiles)
|
public void CreateMuxerAndAddToPath(ProgramFiles programFiles)
|
||||||
{
|
{
|
||||||
var muxerDirectory = TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet");
|
var muxerDirectory =
|
||||||
|
TestDirectory.GetDirectory(GetProgramFilesDirectory(programFiles).FullName, "dotnet");
|
||||||
|
|
||||||
new FileInfo(Path.Combine(muxerDirectory.FullName, Muxer)).Create();
|
new FileInfo(Path.Combine(muxerDirectory.FullName, Muxer)).Create();
|
||||||
|
|
||||||
PathEnvironmentVariable = $"{muxerDirectory}{Path.PathSeparator}{PathEnvironmentVariable}";
|
PathEnvironmentVariable = $"{muxerDirectory}{Path.PathSeparator}{PathEnvironmentVariable}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CreateMSBuildRequiredVersionFile(
|
||||||
|
ProgramFiles programFiles,
|
||||||
|
string sdkVersion,
|
||||||
|
Version minimumMSBuildVersion)
|
||||||
|
{
|
||||||
|
if (minimumMSBuildVersion == null)
|
||||||
|
{
|
||||||
|
minimumMSBuildVersion = new Version(1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cliDirectory = TestDirectory.GetDirectory(
|
||||||
|
GetProgramFilesDirectory(programFiles).FullName,
|
||||||
|
"dotnet",
|
||||||
|
"sdk",
|
||||||
|
sdkVersion);
|
||||||
|
|
||||||
|
File.WriteAllText(
|
||||||
|
Path.Combine(cliDirectory.FullName, "minimumMSBuildVersion"),
|
||||||
|
minimumMSBuildVersion.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
public void CreateGlobalJson(DirectoryInfo directory, string version)
|
public void CreateGlobalJson(DirectoryInfo directory, string version)
|
||||||
=> File.WriteAllText(directory.GetFile("global.json").FullName,
|
=> File.WriteAllText(directory.GetFile("global.json").FullName,
|
||||||
$@"{{ ""sdk"": {{ ""version"": ""{version}"" }} }}");
|
$@"{{ ""sdk"": {{ ""version"": ""{version}"" }} }}");
|
||||||
|
@ -188,6 +250,12 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
|
||||||
{
|
{
|
||||||
public new string ProjectFilePath { get => base.ProjectFilePath; set => base.ProjectFilePath = value; }
|
public new string ProjectFilePath { get => base.ProjectFilePath; set => base.ProjectFilePath = value; }
|
||||||
public new string SolutionFilePath { get => base.SolutionFilePath; set => base.SolutionFilePath = value; }
|
public new string SolutionFilePath { get => base.SolutionFilePath; set => base.SolutionFilePath = value; }
|
||||||
|
public new Version MSBuildVersion { get => base.MSBuildVersion; set => base.MSBuildVersion = value; }
|
||||||
|
|
||||||
|
public MockContext()
|
||||||
|
{
|
||||||
|
MSBuildVersion = new Version(1, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class MockFactory : SdkResultFactory
|
private sealed class MockFactory : SdkResultFactory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue