From ff6cc4e9c3eef575f62a33a642ca80e79d27c9bb Mon Sep 17 00:00:00 2001 From: Viktor Hofer Date: Sat, 12 Feb 2022 02:54:59 +0100 Subject: [PATCH] Allow trimming out incompatible ProjectReferences (#8459) * Allow trimming out incompatible ProjectReferences Today filtering out incompatible inner builds happens in outer builds via hooking the DispatchToInnerBuild target. This works well when your project multi-targets and actually has an outer-build but for single target framework projects filtering isn't possible that way. Instead for traversal builds filter via the ResolveP2PReferences target. Also removing the RawTargetFrameworks attribute on ProjectReferences as it isn't required anymore as the TargetFrameworks attribute contains everything needed for the best target framework selection. --- .../src/ChooseBestP2PTargetFrameworkTask.cs | 24 +++++++++++-------- ...t.DotNet.Build.Tasks.TargetFramework.props | 7 ------ ...DotNet.Build.Tasks.TargetFramework.targets | 7 +++--- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/ChooseBestP2PTargetFrameworkTask.cs b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/ChooseBestP2PTargetFrameworkTask.cs index b1cd848a5f8..ea5af527553 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/ChooseBestP2PTargetFrameworkTask.cs +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/ChooseBestP2PTargetFrameworkTask.cs @@ -3,37 +3,36 @@ using Microsoft.Build.Framework; using System; +using System.Collections.Generic; using System.IO; namespace Microsoft.DotNet.Build.Tasks.TargetFramework { public class ChooseBestP2PTargetFrameworkTask : BuildTask { - [Required] - public string TargetFramework { get; set; } - [Required] public ITaskItem[] ProjectReferencesWithTargetFrameworks { get; set; } [Required] public string RuntimeGraph { get; set; } + [Required] + public string TargetFramework { get; set; } + + public bool OmitIncompatibleProjectReferences { get; set; } + [Output] public ITaskItem[] AnnotatedProjectReferencesWithSetTargetFramework { get; set; } public override bool Execute() { - AnnotatedProjectReferencesWithSetTargetFramework = new ITaskItem[ProjectReferencesWithTargetFrameworks.Length]; + var annotatedProjectReferencesWithSetTargetFramework = new List(ProjectReferencesWithTargetFrameworks.Length); var targetFrameworkResolver = new TargetFrameworkResolver(RuntimeGraph); for (int i = 0; i < ProjectReferencesWithTargetFrameworks.Length; i++) { ITaskItem projectReference = ProjectReferencesWithTargetFrameworks[i]; - string targetFrameworksValue = projectReference.GetMetadata("RawTargetFrameworks"); - if (string.IsNullOrEmpty(targetFrameworksValue)) - { - targetFrameworksValue = projectReference.GetMetadata("TargetFrameworks"); - } + string targetFrameworksValue = projectReference.GetMetadata("TargetFrameworks"); // Allow referencing projects with TargetFrameworks explicitely cleared out, i.e. Microsoft.Build.Traversal. if (!string.IsNullOrWhiteSpace(targetFrameworksValue)) @@ -49,6 +48,10 @@ public override bool Execute() string bestTargetFramework = targetFrameworkResolver.GetBestSupportedTargetFramework(targetFrameworks, referringTargetFramework); if (bestTargetFramework == null) { + if (OmitIncompatibleProjectReferences) + { + continue; + } Log.LogError($"Not able to find a compatible supported target framework for {referringTargetFramework} in Project {Path.GetFileName(projectReference.ItemSpec)}. The Supported Configurations are {string.Join(", ", targetFrameworks)}"); } @@ -74,9 +77,10 @@ public override bool Execute() projectReference.SetMetadata("SkipGetTargetFrameworkProperties", "true"); } - AnnotatedProjectReferencesWithSetTargetFramework[i] = projectReference; + annotatedProjectReferencesWithSetTargetFramework.Add(projectReference); } + AnnotatedProjectReferencesWithSetTargetFramework = annotatedProjectReferencesWithSetTargetFramework.ToArray(); return !Log.HasLoggedErrors; } } diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.props b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.props index 4964ab9c0d7..9c24e29ba34 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.props +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.props @@ -1,12 +1,5 @@ - - - <_ThisProjectBuildMetadata> - $(TargetFrameworks) - - - ..\tools\netcoreapp3.1\Microsoft.DotNet.Build.Tasks.TargetFramework.dll ..\tools\net472\Microsoft.DotNet.Build.Tasks.TargetFramework.dll diff --git a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.targets b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.targets index f3baa42542a..09bedd0094d 100644 --- a/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.targets +++ b/src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.targets @@ -23,9 +23,10 @@ <_ProjectReferenceWithTargetFrameworks Include="@(ProjectReference->WithMetadataValue('SkipGetTargetFrameworkProperties', 'true'))" /> - +