diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/GetPackagesToPrune.cs b/src/Tasks/Microsoft.NET.Build.Tasks/GetPackagesToPrune.cs index bd0cd0107fab..d8afd22d9298 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/GetPackagesToPrune.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/GetPackagesToPrune.cs @@ -235,12 +235,6 @@ static Dictionary LoadPackagesToPruneFromFrameworkPackages { var nugetFramework = new NuGetFramework(targetFrameworkIdentifier, Version.Parse(targetFrameworkVersion)); - // FrameworkPackages just has data for .NET Framework 4.6.1, so turn on fallback for anything greater than that so it will resolve to the .NET Framework 4.6.1 data - if (!acceptNearestMatch && nugetFramework.IsDesktop() && nugetFramework.Version > new Version(4,6,1)) - { - acceptNearestMatch = true; - } - var frameworkPackages = FrameworkPackages.GetFrameworkPackages(nugetFramework, [frameworkReference], acceptNearestMatch) .SelectMany(packages => packages) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); diff --git a/test/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithoutTransitiveProjectRefs.cs b/test/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithoutTransitiveProjectRefs.cs index 57f2fc797cdc..99935e9728ed 100644 --- a/test/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithoutTransitiveProjectRefs.cs +++ b/test/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildAnAppWithoutTransitiveProjectRefs.cs @@ -82,6 +82,7 @@ public void It_cleans_the_project_successfully_with_static_graph_and_isolation() "1.exe", "1.pdb", "1.exe.config", + "System.Diagnostics.DiagnosticSource.dll", }; foreach (var targetFramework in targetFrameworks) diff --git a/test/Microsoft.NET.Build.Tests/GivenThatWeWantToResolveConflicts.cs b/test/Microsoft.NET.Build.Tests/GivenThatWeWantToResolveConflicts.cs index 8b0a073757dc..a44883628403 100644 --- a/test/Microsoft.NET.Build.Tests/GivenThatWeWantToResolveConflicts.cs +++ b/test/Microsoft.NET.Build.Tests/GivenThatWeWantToResolveConflicts.cs @@ -329,8 +329,8 @@ public void PlatformPackagesCanBePruned(bool prunePackages) [InlineData("netstandard1.1", false)] [InlineData("netstandard1.0", false)] [InlineData("net451", false)] - [InlineData("net462")] - [InlineData("net481")] + [InlineData("net462", false)] + [InlineData("net481", false)] // These target frameworks shouldn't prune packages unless explicitly enabled [InlineData("net9.0", false, "")] [InlineData("netstandard2.1", false, "")] @@ -492,6 +492,45 @@ public void WithMultitargetedProjects_PruningsDefaultsAreApplies(string framewor } } + [Fact] + public void WithMultitargetedProject_NETFrameworkIsNotPruned() + { + var project = new TestProject("MultitargetedPruning") + { + TargetFrameworks = ToolsetInfo.CurrentTargetFramework + ";net462", + }; + project.PackageReferences.Add(new TestPackageReference("System.ValueTuple", "4.6.1")); + project.SourceFiles.Add("Test.cs", @" +public class Class1 +{ + public (int, int) GetTuple() => (1, 2); +} +"); + var testAsset = _testAssetsManager.CreateTestProject(project, identifier: "NETFrameworkIsNotPruned"); + var buildCommand = new BuildCommand(testAsset); + buildCommand.Execute().Should().Pass(); + var assetsFilePath = Path.Combine(buildCommand.GetBaseIntermediateDirectory().FullName, "project.assets.json"); + var lockFile = LockFileUtilities.GetLockFile(assetsFilePath, new NullLogger()); + + foreach (var lockFileTarget in lockFile.Targets) + { + var valueTupleLibrary = lockFileTarget.Libraries.Where(library => library.Name.Equals("System.ValueTuple", StringComparison.OrdinalIgnoreCase)).Single(); + var runtimeAssemblies = valueTupleLibrary.RuntimeAssemblies.Where(a => !Path.GetFileName(a.Path).Equals("_._")); + var compileTimeAssemblies = valueTupleLibrary.CompileTimeAssemblies.Where(a => !Path.GetFileName(a.Path).Equals("_._")); + + if (lockFileTarget.TargetFramework.Framework.Equals(".NETFramework", StringComparison.OrdinalIgnoreCase)) + { + runtimeAssemblies.Should().NotBeEmpty(); + compileTimeAssemblies.Should().NotBeEmpty(); + } + else + { + runtimeAssemblies.Should().BeEmpty(); + compileTimeAssemblies.Should().BeEmpty(); + } + } + } + static List> ParsePrunePackageReferenceJson(string json) { List> ret = new();