From aab8e05bead030c32fdc285974e473b63e2c421c Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 20 Jan 2022 02:27:09 +0100 Subject: [PATCH 1/3] Fix build break because of missing metdata In the previous change I didn't notice that the binplacing logic depends on metadata passing in being preserved in the items being returned. Because of that, I revert the collection change from List to HashSet and instead manually iterate through the list. The binplacing logic depends on duplicates being allowed versus the inner build project logic explicitly doesn't want duplicates to avoid unnecessary inner builds, hence adding a switch for it. --- .../src/ChooseBestTargetFrameworksTask.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs index 0f5eaf8aa29..c61ad67d608 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs @@ -4,13 +4,14 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using System.Collections.Generic; +using System.Linq; namespace Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk { public class ChooseBestTargetFrameworksTask : BuildTask { [Required] - public string[] BuildTargetFrameworks { get; set; } + public ITaskItem[] BuildTargetFrameworks { get; set; } [Required] public string RuntimeGraph { get; set; } @@ -18,24 +19,29 @@ public class ChooseBestTargetFrameworksTask : BuildTask [Required] public string[] SupportedTargetFrameworks { get; set; } + // Returns distinct items only. Compares the include values. Metadata is ignored. + public bool Distinct { get; set; } + [Output] - public string[] BestTargetFrameworks { get; set; } + public ITaskItem[] BestTargetFrameworks { get; set; } public override bool Execute() { - var bestTargetFrameworkList = new HashSet(BuildTargetFrameworks.Length); + var bestTargetFrameworkList = new List(BuildTargetFrameworks.Length); var targetframeworkResolver = new TargetFrameworkResolver(RuntimeGraph); - foreach (string buildTargetFramework in BuildTargetFrameworks) + foreach (ITaskItem buildTargetFramework in BuildTargetFrameworks) { - string bestTargetFramework = targetframeworkResolver.GetBestSupportedTargetFramework(SupportedTargetFrameworks, buildTargetFramework); - if (bestTargetFramework != null) + string bestTargetFramework = targetframeworkResolver.GetBestSupportedTargetFramework(SupportedTargetFrameworks, buildTargetFramework.ItemSpec); + if (bestTargetFramework != null && (!Distinct || !bestTargetFrameworkList.Any(b => b.ItemSpec == bestTargetFramework))) { - bestTargetFrameworkList.Add(bestTargetFramework); + var item = new TaskItem(bestTargetFramework); + buildTargetFramework.CopyMetadataTo(item); + bestTargetFrameworkList.Add(item); } } - BestTargetFrameworks = new string[bestTargetFrameworkList.Count]; + BestTargetFrameworks = new TaskItem[bestTargetFrameworkList.Count]; bestTargetFrameworkList.CopyTo(BestTargetFrameworks); return !Log.HasLoggedErrors; From fa47daeb4351ebd057eb14769b58bbb30c95bfb6 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 20 Jan 2022 02:29:22 +0100 Subject: [PATCH 2/3] Update Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets --- .../Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets index 00e27e09c67..4aa1555c3bb 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk.targets @@ -46,7 +46,8 @@ + RuntimeGraph="$(RuntimeGraph)" + Distinct="true"> From e766a1d381636a29837ea5d44446652b28fd8c61 Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Thu, 20 Jan 2022 02:30:30 +0100 Subject: [PATCH 3/3] Update ChooseBestTargetFrameworksTask.cs --- .../src/ChooseBestTargetFrameworksTask.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs index c61ad67d608..f708e98f2ff 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk/src/ChooseBestTargetFrameworksTask.cs @@ -41,9 +41,7 @@ public override bool Execute() } } - BestTargetFrameworks = new TaskItem[bestTargetFrameworkList.Count]; - bestTargetFrameworkList.CopyTo(BestTargetFrameworks); - + BestTargetFrameworks = bestTargetFrameworkList.ToArray(); return !Log.HasLoggedErrors; } }