Skip to content

Commit

Permalink
Allow trimming out incompatible ProjectReferences (#8459)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
ViktorHofer authored Feb 12, 2022
1 parent a50e5e6 commit ff6cc4e
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<ITaskItem>(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))
Expand All @@ -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)}");
}

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

AnnotatedProjectReferencesWithSetTargetFramework[i] = projectReference;
annotatedProjectReferencesWithSetTargetFramework.Add(projectReference);
}

AnnotatedProjectReferencesWithSetTargetFramework = annotatedProjectReferencesWithSetTargetFramework.ToArray();
return !Log.HasLoggedErrors;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
<!-- Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. -->
<Project>
<!-- Add unparsed TargetFrameworks property to GetTargetFrameworks return item metadata to read from it later. -->
<ItemDefinitionGroup>
<_ThisProjectBuildMetadata>
<RawTargetFrameworks>$(TargetFrameworks)</RawTargetFrameworks>
</_ThisProjectBuildMetadata>
</ItemDefinitionGroup>

<PropertyGroup>
<DotNetBuildTasksTargetFrameworkAssembly Condition="'$(MSBuildRuntimeType)' == 'core'">..\tools\netcoreapp3.1\Microsoft.DotNet.Build.Tasks.TargetFramework.dll</DotNetBuildTasksTargetFrameworkAssembly>
<DotNetBuildTasksTargetFrameworkAssembly Condition="'$(MSBuildRuntimeType)' != 'core'">..\tools\net472\Microsoft.DotNet.Build.Tasks.TargetFramework.dll</DotNetBuildTasksTargetFrameworkAssembly>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@
<_ProjectReferenceWithTargetFrameworks Include="@(ProjectReference->WithMetadataValue('SkipGetTargetFrameworkProperties', 'true'))" />
</ItemGroup>

<ChooseBestP2PTargetFrameworkTask TargetFramework="$(TargetFramework)"
ProjectReferencesWithTargetFrameworks="@(_ProjectReferenceWithTargetFrameworks)"
RuntimeGraph="$(RuntimeGraph)">
<ChooseBestP2PTargetFrameworkTask ProjectReferencesWithTargetFrameworks="@(_ProjectReferenceWithTargetFrameworks)"
RuntimeGraph="$(RuntimeGraph)"
TargetFramework="$(TargetFramework)"
OmitIncompatibleProjectReferences="$(OmitIncompatibleProjectReferences)">
<Output TaskParameter="AnnotatedProjectReferencesWithSetTargetFramework" ItemName="_ProjectReferenceWithBestTargetFramework" />
</ChooseBestP2PTargetFrameworkTask>

Expand Down

0 comments on commit ff6cc4e

Please sign in to comment.