diff --git a/src/Tasks/Common/MetadataKeys.cs b/src/Tasks/Common/MetadataKeys.cs index 71d66a3d8f69..57d9c84677a5 100644 --- a/src/Tasks/Common/MetadataKeys.cs +++ b/src/Tasks/Common/MetadataKeys.cs @@ -18,6 +18,7 @@ internal static class MetadataKeys public const string IsTopLevelDependency = "IsTopLevelDependency"; public const string AllowExplicitVersion = "AllowExplicitVersion"; public const string RelativePath = "RelativePath"; + public const string DiagnosticLevel = "DiagnosticLevel"; // Target Metadata public const string RuntimeIdentifier = "RuntimeIdentifier"; diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs index e972844b2b52..b94610630980 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs @@ -8,6 +8,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using NuGet.Common; using Xunit; using static Microsoft.NET.Build.Tasks.UnitTests.LockFileSnippets; @@ -162,6 +163,45 @@ public void ItAssignsExpectedTopLevelDependencies() }); } + [Fact] + public void ItAssignsDiagnosticLevel() + { + const string target1 = ".NETCoreApp,Version=v1.0"; + const string target2 = ".NETCoreApp,Version=v2.0"; + + string lockFileContent = CreateLockFileSnippet( + targets: new string[] { + CreateTarget(".NETCoreApp,Version=v1.0", TargetLibA, TargetLibB, TargetLibC), + CreateTarget(".NETCoreApp,Version=v1.0/osx.10.11-x64", TargetLibA, TargetLibB, TargetLibC), + }, + libraries: new string[] { LibADefn, LibBDefn, LibCDefn }, + projectFileDependencyGroups: new string[] { NETCoreGroup, NETCoreOsxGroup }, + logs: new[] + { + // LibA + CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibA", targetGraphs: new[] { target1 }), + CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibA", targetGraphs: new[] { target1 }), + CreateLog(NuGetLogCode.NU1000, LogLevel.Error, "", libraryId: "LibA", targetGraphs: new[] { target1 }), + // LibB + CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { target1, target2 }), + CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { target1, target2 }), + // LibC (wrong target) + CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "", libraryId: "LibB", targetGraphs: new[] { target2 }), + CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "", libraryId: "LibB", targetGraphs: new[] { target2 }) + } + ); + + var task = GetExecutedTaskFromContents(lockFileContent, out _, target: target1); + + var defs = task.PackageDefinitions.ToLookup(def => def.ItemSpec); + + defs.Count().Should().Be(3); + + defs["LibA/1.2.3"].Single().GetMetadata(MetadataKeys.DiagnosticLevel).Should().Be("Error"); + defs["LibB/1.2.3"].Single().GetMetadata(MetadataKeys.DiagnosticLevel).Should().Be("Warning"); + defs["LibC/1.2.3"].Single().GetMetadata(MetadataKeys.DiagnosticLevel).Should().BeEmpty(); + } + [Fact] public void ItAssignsExpectedTopLevelDependenciesFromAllTargets() { @@ -788,19 +828,19 @@ public void ItMarksTransitiveProjectReferences() others.Where(t => t.ItemSpec == "ProjF/1.0.0").Count().Should().Be(1); } - private static ResolvePackageDependencies GetExecutedTaskFromPrefix(string lockFilePrefix, out LockFile lockFile, bool emitLegacyAssetsFileItems = true) + private static ResolvePackageDependencies GetExecutedTaskFromPrefix(string lockFilePrefix, out LockFile lockFile, bool emitLegacyAssetsFileItems = true, string target = null) { lockFile = TestLockFiles.GetLockFile(lockFilePrefix); - return GetExecutedTask(lockFile, emitLegacyAssetsFileItems); + return GetExecutedTask(lockFile, emitLegacyAssetsFileItems, target); } - private static ResolvePackageDependencies GetExecutedTaskFromContents(string lockFileContents, out LockFile lockFile, bool emitLegacyAssetsFileItems = true) + private static ResolvePackageDependencies GetExecutedTaskFromContents(string lockFileContents, out LockFile lockFile, bool emitLegacyAssetsFileItems = true, string target = null) { lockFile = TestLockFiles.CreateLockFile(lockFileContents); - return GetExecutedTask(lockFile, emitLegacyAssetsFileItems); + return GetExecutedTask(lockFile, emitLegacyAssetsFileItems, target); } - private static ResolvePackageDependencies GetExecutedTask(LockFile lockFile, bool emitLegacyAssetsFileItems) + private static ResolvePackageDependencies GetExecutedTask(LockFile lockFile, bool emitLegacyAssetsFileItems, string target) { var resolver = new MockPackageResolver(_packageRoot); @@ -809,7 +849,8 @@ private static ResolvePackageDependencies GetExecutedTask(LockFile lockFile, boo ProjectAssetsFile = lockFile.Path, ProjectPath = _projectPath, ProjectLanguage = null, - EmitLegacyAssetsFileItems = emitLegacyAssetsFileItems + EmitLegacyAssetsFileItems = emitLegacyAssetsFileItems, + TargetFrameworkMoniker = target }; task.Execute().Should().BeTrue(); diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs index a3140e0531fc..c454cf4a50b4 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs @@ -77,7 +77,8 @@ public void ItShouldReturnUnresolvedPackageDependenciesWithTypePackage() { MetadataKeys.Version, "1.0.0" }, { MetadataKeys.Path, "some path" }, { MetadataKeys.ResolvedPath, "" }, - { MetadataKeys.Type, "Unresolved" } + { MetadataKeys.Type, "Unresolved" }, + { MetadataKeys.DiagnosticLevel, "Warning" } }) }, PackageDependencies = new ITaskItem[] @@ -100,6 +101,7 @@ public void ItShouldReturnUnresolvedPackageDependenciesWithTypePackage() Assert.Equal("1.0.0", item.GetMetadata(MetadataKeys.Version)); Assert.Equal("some path", item.GetMetadata(MetadataKeys.Path)); Assert.Equal("", item.GetMetadata(MetadataKeys.ResolvedPath)); + Assert.Equal("Warning", item.GetMetadata(MetadataKeys.DiagnosticLevel)); Assert.False(item.GetBooleanMetadata(MetadataKeys.IsImplicitlyDefined)); Assert.False(item.GetBooleanMetadata(PreprocessPackageDependenciesDesignTime.ResolvedMetadata)); } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs b/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs index 5e9fe997a33b..bacde6eb4335 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs @@ -32,6 +32,7 @@ public class PreprocessPackageDependenciesDesignTime : TaskBase /// - ResolvedPath = "C:\Users\drnoakes\.nuget\packages\metadataextractor\1.0.0" /// - Type = "package" /// - Version = "2.3.0" + /// - DiagnosticLevel = "" /// [Required] public ITaskItem[] PackageDefinitions { get; set; } @@ -122,12 +123,14 @@ protected override void ExecuteCore() ? resolvedPath : packageDef.GetMetadata(MetadataKeys.Path)) ?? string.Empty; var isImplicitlyDefined = implicitPackageReferences.Contains(name); + var diagnosticLevel = packageDef.GetMetadata(MetadataKeys.DiagnosticLevel) ?? string.Empty; var outputItem = new TaskItem(packageDef.ItemSpec); outputItem.SetMetadata(MetadataKeys.Name, name); outputItem.SetMetadata(MetadataKeys.Version, version); outputItem.SetMetadata(MetadataKeys.Path, path); outputItem.SetMetadata(MetadataKeys.IsImplicitlyDefined, isImplicitlyDefined.ToString()); + outputItem.SetMetadata(MetadataKeys.DiagnosticLevel, diagnosticLevel); outputItem.SetMetadata(ResolvedMetadata, resolved.ToString()); outputItems.Add(outputItem); diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs index 0eea24fceb40..9d70feee2e48 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs @@ -119,6 +119,8 @@ public string ProjectLanguage /// public bool EmitLegacyAssetsFileItems { get; set; } = false; + public string TargetFrameworkMoniker { get; set; } + #endregion public ResolvePackageDependencies() @@ -173,6 +175,8 @@ private void GetPackageAndFileDefinitions() string resolvedPackagePath = ResolvePackagePath(package); item.SetMetadata(MetadataKeys.ResolvedPath, resolvedPackagePath ?? string.Empty); + item.SetMetadata(MetadataKeys.DiagnosticLevel, GetPackageDiagnosticLevel(package)); + _packageDefinitions.Add(item); if (!EmitLegacyAssetsFileItems) @@ -227,6 +231,20 @@ private void GetPackageAndFileDefinitions() _fileDefinitions.Add(fileItem); } } + + string GetPackageDiagnosticLevel(LockFileLibrary package) + { + string target = TargetFrameworkMoniker ?? ""; + + var messages = LockFile.LogMessages.Where(log => log.LibraryId == package.Name && log.TargetGraphs.Contains(target)); + + if (!messages.Any()) + { + return string.Empty; + } + + return messages.Max(log => log.Level).ToString(); + } } // get target definitions and package and file dependencies diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets index 98e5ed94f261..808824e20bb0 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets @@ -188,6 +188,7 @@ Copyright (c) .NET Foundation. All rights reserved. ProjectAssetsFile="$(ProjectAssetsFile)" ProjectLanguage="$(Language)" EmitLegacyAssetsFileItems="$(EmitLegacyAssetsFileItems)" + TargetFrameworkMoniker="$(NuGetTargetMoniker)" ContinueOnError="ErrorAndContinue">