Skip to content

Commit ff6cc4e

Browse files
authored
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.
1 parent a50e5e6 commit ff6cc4e

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed

src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/ChooseBestP2PTargetFrameworkTask.cs

+14-10
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,36 @@
33

44
using Microsoft.Build.Framework;
55
using System;
6+
using System.Collections.Generic;
67
using System.IO;
78

89
namespace Microsoft.DotNet.Build.Tasks.TargetFramework
910
{
1011
public class ChooseBestP2PTargetFrameworkTask : BuildTask
1112
{
12-
[Required]
13-
public string TargetFramework { get; set; }
14-
1513
[Required]
1614
public ITaskItem[] ProjectReferencesWithTargetFrameworks { get; set; }
1715

1816
[Required]
1917
public string RuntimeGraph { get; set; }
2018

19+
[Required]
20+
public string TargetFramework { get; set; }
21+
22+
public bool OmitIncompatibleProjectReferences { get; set; }
23+
2124
[Output]
2225
public ITaskItem[] AnnotatedProjectReferencesWithSetTargetFramework { get; set; }
2326

2427
public override bool Execute()
2528
{
26-
AnnotatedProjectReferencesWithSetTargetFramework = new ITaskItem[ProjectReferencesWithTargetFrameworks.Length];
29+
var annotatedProjectReferencesWithSetTargetFramework = new List<ITaskItem>(ProjectReferencesWithTargetFrameworks.Length);
2730
var targetFrameworkResolver = new TargetFrameworkResolver(RuntimeGraph);
2831

2932
for (int i = 0; i < ProjectReferencesWithTargetFrameworks.Length; i++)
3033
{
3134
ITaskItem projectReference = ProjectReferencesWithTargetFrameworks[i];
32-
string targetFrameworksValue = projectReference.GetMetadata("RawTargetFrameworks");
33-
if (string.IsNullOrEmpty(targetFrameworksValue))
34-
{
35-
targetFrameworksValue = projectReference.GetMetadata("TargetFrameworks");
36-
}
35+
string targetFrameworksValue = projectReference.GetMetadata("TargetFrameworks");
3736

3837
// Allow referencing projects with TargetFrameworks explicitely cleared out, i.e. Microsoft.Build.Traversal.
3938
if (!string.IsNullOrWhiteSpace(targetFrameworksValue))
@@ -49,6 +48,10 @@ public override bool Execute()
4948
string bestTargetFramework = targetFrameworkResolver.GetBestSupportedTargetFramework(targetFrameworks, referringTargetFramework);
5049
if (bestTargetFramework == null)
5150
{
51+
if (OmitIncompatibleProjectReferences)
52+
{
53+
continue;
54+
}
5255
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)}");
5356
}
5457

@@ -74,9 +77,10 @@ public override bool Execute()
7477
projectReference.SetMetadata("SkipGetTargetFrameworkProperties", "true");
7578
}
7679

77-
AnnotatedProjectReferencesWithSetTargetFramework[i] = projectReference;
80+
annotatedProjectReferencesWithSetTargetFramework.Add(projectReference);
7881
}
7982

83+
AnnotatedProjectReferencesWithSetTargetFramework = annotatedProjectReferencesWithSetTargetFramework.ToArray();
8084
return !Log.HasLoggedErrors;
8185
}
8286
}

src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.props

-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
22
<Project>
3-
<!-- Add unparsed TargetFrameworks property to GetTargetFrameworks return item metadata to read from it later. -->
4-
<ItemDefinitionGroup>
5-
<_ThisProjectBuildMetadata>
6-
<RawTargetFrameworks>$(TargetFrameworks)</RawTargetFrameworks>
7-
</_ThisProjectBuildMetadata>
8-
</ItemDefinitionGroup>
9-
103
<PropertyGroup>
114
<DotNetBuildTasksTargetFrameworkAssembly Condition="'$(MSBuildRuntimeType)' == 'core'">..\tools\netcoreapp3.1\Microsoft.DotNet.Build.Tasks.TargetFramework.dll</DotNetBuildTasksTargetFrameworkAssembly>
125
<DotNetBuildTasksTargetFrameworkAssembly Condition="'$(MSBuildRuntimeType)' != 'core'">..\tools\net472\Microsoft.DotNet.Build.Tasks.TargetFramework.dll</DotNetBuildTasksTargetFrameworkAssembly>

src/Microsoft.DotNet.Build.Tasks.TargetFramework/src/build/Microsoft.DotNet.Build.Tasks.TargetFramework.targets

+4-3
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
<_ProjectReferenceWithTargetFrameworks Include="@(ProjectReference->WithMetadataValue('SkipGetTargetFrameworkProperties', 'true'))" />
2424
</ItemGroup>
2525

26-
<ChooseBestP2PTargetFrameworkTask TargetFramework="$(TargetFramework)"
27-
ProjectReferencesWithTargetFrameworks="@(_ProjectReferenceWithTargetFrameworks)"
28-
RuntimeGraph="$(RuntimeGraph)">
26+
<ChooseBestP2PTargetFrameworkTask ProjectReferencesWithTargetFrameworks="@(_ProjectReferenceWithTargetFrameworks)"
27+
RuntimeGraph="$(RuntimeGraph)"
28+
TargetFramework="$(TargetFramework)"
29+
OmitIncompatibleProjectReferences="$(OmitIncompatibleProjectReferences)">
2930
<Output TaskParameter="AnnotatedProjectReferencesWithSetTargetFramework" ItemName="_ProjectReferenceWithBestTargetFramework" />
3031
</ChooseBestP2PTargetFrameworkTask>
3132

0 commit comments

Comments
 (0)