Skip to content

Commit 9fea2ad

Browse files
authored
Improve target graph handling in log messages (#50694)
1 parent a219732 commit 9fea2ad

File tree

4 files changed

+66
-33
lines changed

4 files changed

+66
-33
lines changed

src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,17 @@ public void ItAssignsExpectedTopLevelDependencies()
141141
});
142142
}
143143

144-
[Fact]
145-
public void ItAssignsDiagnosticLevel()
144+
[Theory]
145+
[InlineData(true)]
146+
[InlineData(false)]
147+
public void ItAssignsDiagnosticLevel(bool useAlias)
146148
{
147149
const string target1 = ".NETCoreApp,Version=v1.0";
148150
const string target2 = ".NETCoreApp,Version=v2.0";
149151

152+
string alias1 = useAlias ? "netcoreapp1.0" : target1;
153+
string alias2 = useAlias ? "netcoreapp2.0" : target2;
154+
150155
string lockFileContent = CreateLockFileSnippet(
151156
targets: new string[] {
152157
CreateTarget("netcoreapp1.0", TargetLibA, TargetLibB, TargetLibC),
@@ -157,15 +162,15 @@ public void ItAssignsDiagnosticLevel()
157162
logs: new[]
158163
{
159164
// LibA
160-
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibA", targetGraphs: new[] { target1 }),
161-
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibA", targetGraphs: new[] { target1 }),
162-
CreateLog(NuGetLogCode.NU1000, LogLevel.Error, "", libraryId: "LibA", targetGraphs: new[] { target1 }),
165+
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibA", targetGraphs: new[] { alias1 }),
166+
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibA", targetGraphs: new[] { alias1 }),
167+
CreateLog(NuGetLogCode.NU1000, LogLevel.Error, "", libraryId: "LibA", targetGraphs: new[] { alias1 }),
163168
// LibB
164-
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { target1, target2 }),
165-
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { target1, target2 }),
169+
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { alias1, alias2 }),
170+
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { alias1, alias2 }),
166171
// LibC (wrong target)
167-
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { target2 }),
168-
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { target2 })
172+
CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { alias2 }),
173+
CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { alias2 })
169174
}
170175
);
171176

src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -351,20 +351,22 @@ public void ItShouldOnlyReturnPackagesInTheSpecifiedTarget()
351351
Assert.Equal("top.package1/1.0.0", item1.ItemSpec);
352352
}
353353

354-
[WindowsOnlyFact]
355-
public void ItShouldOnlyReturnTopLevelPackages()
354+
[WindowsOnlyTheory]
355+
[InlineData("latestNet")]
356+
[InlineData("net6.0")]
357+
public void ItShouldOnlyReturnTopLevelPackages(string alias)
356358
{
357359
var testRoot = _testAssetsManager.CreateTestDirectory().Path;
358360
Log.WriteLine("Test root: " + testRoot);
359361

360362
string projectAssetsJsonPath = Path.Combine(testRoot, "project.assets.json");
361363
string projectCacheAssetsJsonPath = Path.Combine(testRoot, "projectassets.cache");
362364
// project.assets.json
363-
File.WriteAllText(projectAssetsJsonPath, CreateBasicProjectAssetsFile(testRoot));
365+
File.WriteAllText(projectAssetsJsonPath, CreateBasicProjectAssetsFile(testRoot, alias: alias));
364366
var task = InitializeTask(testRoot, out _);
365367
task.ProjectAssetsFile = projectAssetsJsonPath;
366368
task.ProjectAssetsCacheFile = projectCacheAssetsJsonPath;
367-
task.TargetFramework = "net6.0";
369+
task.TargetFramework = alias;
368370
task.Execute();
369371

370372
// Verify all top packages are listed here
@@ -404,7 +406,7 @@ public void ItShouldOnlyReturnTopLevelPackages()
404406
/// </c>
405407
/// dependent.package2 has an error message, and dependent.package3 has a warning.
406408
/// </remarks>
407-
private string CreateBasicProjectAssetsFile(string testRoot, string package2Type = "package", string package3Type = "package")
409+
private string CreateBasicProjectAssetsFile(string testRoot, string package2Type = "package", string package3Type = "package", string alias = "net6.0")
408410
{
409411
var json =
410412
"""
@@ -586,11 +588,11 @@ private string CreateBasicProjectAssetsFile(string testRoot, string package2Type
586588
"C:\\configDir3\\Microsoft.VisualStudio.Offline.config"
587589
],
588590
"originalTargetFrameworks": [
589-
"net6.0"
591+
"TFM_ALIAS"
590592
],
591593
"frameworks": {
592594
"net6.0": {
593-
"targetAlias": "net6.0",
595+
"targetAlias": "TFM_ALIAS",
594596
"projectReferences": {}
595597
}
596598
},
@@ -602,7 +604,7 @@ private string CreateBasicProjectAssetsFile(string testRoot, string package2Type
602604
},
603605
"frameworks" : {
604606
"net6.0": {
605-
"targetAlias" : "net6.0",
607+
"targetAlias" : "TFM_ALIAS",
606608
"dependencies" : {
607609
"top.package1" : {
608610
"target" : "Package",
@@ -620,7 +622,7 @@ private string CreateBasicProjectAssetsFile(string testRoot, string package2Type
620622
"message": "some warning message",
621623
"libraryId": "dependent.package2",
622624
"targetGraphs": [
623-
"net6.0"
625+
"TFM_ALIAS"
624626
]
625627
},
626628
{
@@ -630,14 +632,15 @@ private string CreateBasicProjectAssetsFile(string testRoot, string package2Type
630632
"message": "some warning message",
631633
"libraryId": "dependent.package3",
632634
"targetGraphs": [
633-
"net6.0"
635+
"TFM_ALIAS"
634636
]
635637
}
636638
]
637639
}
638640
""";
639641
return json.Replace("PACKAGE2_TYPE", package2Type)
640642
.Replace("PACKAGE3_TYPE", package3Type)
643+
.Replace("TFM_ALIAS", alias)
641644
.Replace(@"C:\\.nuget", $@"{testRoot.Replace("\\", "\\\\")}\\.nuget");
642645
}
643646
private ResolvePackageAssets InitializeTask(string testRoot, out IEnumerable<PropertyInfo> inputProperties)

src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,10 +1575,19 @@ Dictionary<string, HashSet<string>> GetReverseDependencies()
15751575
bool ForCurrentTargetFramework(string targetFramework)
15761576
{
15771577
var parts = targetFramework.Split(LockFile.DirectorySeparatorChar);
1578-
var parsedTargetGraph = NuGetFramework.Parse(parts[0]);
1579-
var alias = _lockFile.PackageSpec.TargetFrameworks
1580-
.FirstOrDefault(tf => tf.FrameworkName == parsedTargetGraph)
1581-
?.TargetAlias ?? targetFramework;
1578+
string alias = parts[0];
1579+
if (alias == _task.TargetFramework)
1580+
{
1581+
return true;
1582+
}
1583+
else
1584+
{
1585+
var parsedTargetGraph = NuGetFramework.Parse(alias);
1586+
alias = _lockFile.PackageSpec.TargetFrameworks
1587+
.FirstOrDefault(tf => tf.FrameworkName == parsedTargetGraph)
1588+
?.TargetAlias ?? targetFramework;
1589+
}
1590+
15821591
return alias == _task.TargetFramework;
15831592
}
15841593

src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using Microsoft.Build.Framework;
77
using Microsoft.Build.Utilities;
8+
using NuGet.Common;
89
using NuGet.Frameworks;
910
using NuGet.ProjectModel;
1011

@@ -238,20 +239,35 @@ string GetPackageDiagnosticLevel(LockFileLibrary package)
238239
{
239240
string target = TargetFramework ?? "";
240241

241-
var messages = LockFile.LogMessages.Where(log => log.LibraryId == package.Name && log.TargetGraphs
242-
.Select(tg =>
243-
{
244-
var parsedTargetGraph = NuGetFramework.Parse(tg);
245-
var alias = _lockFile.PackageSpec.TargetFrameworks.FirstOrDefault(tf => tf.FrameworkName == parsedTargetGraph)?.TargetAlias;
246-
return alias ?? tg;
247-
}).Contains(target));
242+
LogLevel? logLevel = null;
248243

249-
if (!messages.Any())
244+
foreach (var message in LockFile.LogMessages)
250245
{
251-
return string.Empty;
246+
if (message.LibraryId == package.Name)
247+
{
248+
foreach (var targetGraph in message.TargetGraphs)
249+
{
250+
string effectiveTargetGraphName = targetGraph;
251+
// If the target graph is not in the map, then very likely aliases are being used.
252+
if (_targetNameToAliasMap.ContainsKey(targetGraph))
253+
{
254+
var parsedTargetGraph = NuGetFramework.Parse(targetGraph);
255+
effectiveTargetGraphName = _lockFile.PackageSpec.TargetFrameworks.FirstOrDefault(tf => tf.FrameworkName == parsedTargetGraph)?.TargetAlias;
256+
}
257+
258+
if (effectiveTargetGraphName == target)
259+
{
260+
if (logLevel == null || message.Level > logLevel)
261+
{
262+
logLevel = message.Level;
263+
}
264+
break;
265+
}
266+
}
267+
}
252268
}
253269

254-
return messages.Max(log => log.Level).ToString();
270+
return logLevel != null ? logLevel.ToString() : string.Empty;
255271
}
256272
}
257273

0 commit comments

Comments
 (0)