diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs index 0016504f3fda..ab5baf420631 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolveFrameworkReferences.cs @@ -48,6 +48,9 @@ public class ResolveFrameworkReferences : TaskBase [Output] public ITaskItem[] PackagesToDownload { get; set; } + [Output] + public ITaskItem[] LegacyFrameworkPackages { get; set; } + [Output] public ITaskItem[] RuntimeFrameworks { get; set; } @@ -80,6 +83,7 @@ protected override void ExecuteCore() var frameworkReferenceMap = FrameworkReferences.ToDictionary(fr => fr.ItemSpec); List packagesToDownload = new List(); + List legacyFrameworkPackages = new List(); List runtimeFrameworks = new List(); List targetingPacks = new List(); List runtimePacks = new List(); @@ -91,6 +95,21 @@ protected override void ExecuteCore() { frameworkReferenceMap.TryGetValue(knownFrameworkReference.Name, out ITaskItem frameworkReference); + if (frameworkReference != null) + { + if (!string.IsNullOrEmpty(knownFrameworkReference.LegacyFrameworkPackages)) + { + foreach (var packageAndVersion in knownFrameworkReference.LegacyFrameworkPackages.Split(';')) + { + var items = packageAndVersion.Split('/'); + TaskItem packageToReference = new TaskItem(items[0]); + packageToReference.SetMetadata(MetadataKeys.Version, items[1]); + + legacyFrameworkPackages.Add(packageToReference); + } + } + } + // Get the path of the targeting pack in the targeting pack root (e.g. dotnet/ref) TaskItem targetingPack = new TaskItem(knownFrameworkReference.Name); targetingPack.SetMetadata(MetadataKeys.PackageName, knownFrameworkReference.TargetingPackName); @@ -182,6 +201,11 @@ protected override void ExecuteCore() PackagesToDownload = packagesToDownload.ToArray(); } + if (legacyFrameworkPackages.Any()) + { + LegacyFrameworkPackages = legacyFrameworkPackages.ToArray(); + } + if (runtimeFrameworks.Any()) { RuntimeFrameworks = runtimeFrameworks.ToArray(); @@ -352,6 +376,19 @@ public KnownFrameworkReference(ITaskItem item) public string RuntimePackRuntimeIdentifiers => _item.GetMetadata("RuntimePackRuntimeIdentifiers"); + public string LegacyFrameworkPackages + { + get + { + var packages = _item.GetMetadata("LegacyFrameworkPackages"); + if (string.IsNullOrEmpty(packages)) + { + packages = _item.GetMetadata("PackagesToReference"); + } + return packages; + } + } + public NuGetFramework TargetFramework { get; } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.DefaultItems.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.DefaultItems.targets index 1d8380c8ae75..ad72d160c955 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.DefaultItems.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.DefaultItems.targets @@ -181,23 +181,6 @@ Copyright (c) .NET Foundation. All rights reserved. $(_TargetFrameworkVersionWithoutV) - - - diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.TargetingPackResolution.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.TargetingPackResolution.targets index cc0247e3f7d1..83202893ba31 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.TargetingPackResolution.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.TargetingPackResolution.targets @@ -91,6 +91,7 @@ Copyright (c) .NET Foundation. All rights reserved. EnableTargetingPackDownload="$(EnableTargetingPackDownload)"> + @@ -141,6 +142,16 @@ Copyright (c) .NET Foundation. All rights reserved. ExcludeAssets="all" /> + + + + + diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildANetCoreApp.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildANetCoreApp.cs index b4940f269373..e67fb149f560 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildANetCoreApp.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildANetCoreApp.cs @@ -616,5 +616,68 @@ static void Main(string[] args) .Should() .Pass(); } + + [Fact(Skip = "https://github.com/dotnet/sdk/issues/3044")] + public void ReferenceLegacyContracts() + { + var testProject = new TestProject() + { + Name = "ReferencesLegacyContracts", + TargetFrameworks = "netcoreapp3.0", + IsSdkProject = true, + IsExe = true, + RuntimeIdentifier = EnvironmentInfo.GetCompatibleRid("netcoreapp3.0") + }; + + // Dependencies on contracts from different 1.x "bands" can cause downgrades when building + // with a RuntimeIdentifier. + testProject.PackageReferences.Add(new TestPackageReference("System.IO.FileSystem", "4.0.1")); + testProject.PackageReferences.Add(new TestPackageReference("System.Reflection", "4.3.0")); + + + var testAsset = _testAssetsManager.CreateTestProject(testProject, testProject.Name) + .Restore(Log, testProject.Name); + + var buildCommand = new BuildCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + + buildCommand + .Execute() + .Should() + .Pass(); + } + + [Fact] + public void ItHasNoPackageReferences() + { + var testProject = new TestProject() + { + Name = "NoPackageReferences", + TargetFrameworks = "netcoreapp3.0", + IsSdkProject = true, + IsExe = true + }; + + var testAsset = _testAssetsManager.CreateTestProject(testProject, testProject.Name) + .Restore(Log, testProject.Name); + + string testDirectory = Path.Combine(testAsset.TestRoot, testProject.Name); + + var getPackageReferences = new GetValuesCommand( + Log, + testDirectory, + testProject.TargetFrameworks, + "PackageReference", + GetValuesCommand.ValueType.Item); + + getPackageReferences.Execute().Should().Pass(); + + List packageReferences = getPackageReferences.GetValues(); + + packageReferences + .Should() + .BeEmpty(); + + + } } }