diff --git a/src/Tasks/Common/DiagnosticMessageSeverity.cs b/src/Tasks/Common/DiagnosticMessageSeverity.cs deleted file mode 100644 index b127b4c9d591..000000000000 --- a/src/Tasks/Common/DiagnosticMessageSeverity.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace Microsoft.NET.Build.Tasks -{ - /// - /// Specifies the severity of Diagnostic Messages - /// - internal enum DiagnosticMessageSeverity - { - Info, - Warning, - Error, - } -} diff --git a/src/Tasks/Common/DiagnosticsHelper.cs b/src/Tasks/Common/DiagnosticsHelper.cs deleted file mode 100644 index 58518655beeb..000000000000 --- a/src/Tasks/Common/DiagnosticsHelper.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System.Collections.Generic; - -namespace Microsoft.NET.Build.Tasks -{ - /// - /// Writes diagnostic messages to the task log and creates diagnostic task items - /// that can be returned from a task - /// - internal sealed class DiagnosticsHelper - { - private readonly List _diagnosticMessages = new List(); - - public ITaskItem[] GetDiagnosticMessages() => _diagnosticMessages.ToArray(); - - public ITaskItem Add( - string diagnosticCode, - string message, - string filePath, - DiagnosticMessageSeverity severity, - int startLine, - int startColumn, - int endLine, - int endColumn, - string targetFrameworkMoniker, - string packageId) - { - string itemspec = - (string.IsNullOrEmpty(targetFrameworkMoniker) ? string.Empty : $"{targetFrameworkMoniker}/") + - (string.IsNullOrEmpty(packageId) ? string.Empty : $"{packageId}/") + - diagnosticCode; - - var diagnostic = new TaskItem(itemspec, new Dictionary - { - { MetadataKeys.DiagnosticCode, diagnosticCode }, - { MetadataKeys.Message, message }, - { MetadataKeys.FilePath, filePath ?? string.Empty }, - { MetadataKeys.Severity, severity.ToString() }, - - { MetadataKeys.StartLine, startLine.ToString() }, - { MetadataKeys.StartColumn, startColumn.ToString() }, - { MetadataKeys.EndLine, endLine.ToString() }, - { MetadataKeys.EndColumn, endColumn.ToString() }, - - { MetadataKeys.ParentTarget, targetFrameworkMoniker ?? string.Empty }, - { MetadataKeys.ParentPackage, packageId ?? string.Empty }, - }); - - _diagnosticMessages.Add(diagnostic); - - return diagnostic; - } - } -} diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs index d214c0741022..e972844b2b52 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenAResolvePackageDependenciesTask.cs @@ -20,9 +20,9 @@ public class GivenAResolvePackageDependenciesTask [Theory] [MemberData(nameof(ItemCounts))] - public void ItRaisesLockFileToMSBuildItems(string projectName, int [] counts) + public void ItRaisesLockFileToMSBuildItems(string projectName, int[] counts, bool emitLegacyAssetsFileItems) { - var task = GetExecutedTaskFromPrefix(projectName); + var task = GetExecutedTaskFromPrefix(projectName, out _, emitLegacyAssetsFileItems); task.PackageDefinitions .Count().Should().Be(counts[0]); task.FileDefinitions .Count().Should().Be(counts[1]); @@ -39,22 +39,42 @@ public static IEnumerable ItemCounts { new object[] { "dotnet.new", - new int[] { 110, 2536, 1, 846, 73 } + new int[] { 110, 2536, 1, 846, 73 }, + true + }, + new object[] { + "dotnet.new", + new int[] { 110, 0, 0, 846, 0 }, + false + }, + new object[] { + "simple.dependencies", + new int[] { 113, 2613, 1, 878, 94 }, + true }, new object[] { "simple.dependencies", - new int[] { 113, 2613, 1, 878, 94} + new int[] { 113, 0, 0, 878, 0 }, + false }, }; } } + [Fact] + public void ItOmitsLegacyItemsByDefault() + { + var task = new ResolvePackageDependencies(); + + task.EmitLegacyAssetsFileItems.Should().Be(false); + } + [Theory] [InlineData("dotnet.new")] [InlineData("simple.dependencies")] public void ItAssignsTypeMetaDataToEachDefinition(string projectName) { - var task = GetExecutedTaskFromPrefix(projectName); + var task = GetExecutedTaskFromPrefix(projectName, out _); Func allTyped = (items) => items.All(x => !string.IsNullOrEmpty(x.GetMetadata(MetadataKeys.Type))); @@ -129,7 +149,7 @@ public void ItAssignsExpectedTopLevelDependencies() } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); var topLevels = task.PackageDependencies .Where(t => string.IsNullOrEmpty(t.GetMetadata(MetadataKeys.ParentPackage))); @@ -166,7 +186,7 @@ public void ItAssignsExpectedTopLevelDependenciesFromAllTargets() } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); var topLevels = task.PackageDependencies .Where(t => string.IsNullOrEmpty(t.GetMetadata(MetadataKeys.ParentPackage))); @@ -199,7 +219,7 @@ public void ItAssignsTargetDefinitionMetadata() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); task.TargetDefinitions.Count().Should().Be(2); @@ -338,7 +358,7 @@ public void ItAssignsFileDefinitionMetadata() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); IEnumerable fileDefns; @@ -385,7 +405,7 @@ public void ItAssignsFileDependenciesMetadata() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); IEnumerable fileDeps; @@ -426,7 +446,7 @@ public void ItRaisesAssetPropertiesToFileDependenciesMetadata() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); IEnumerable fileDeps; @@ -474,7 +494,7 @@ public void ItExcludesPlaceholderFiles() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); task.FileDefinitions .Any(t => t.GetMetadata(MetadataKeys.Path) == "lib/file/Z.dll") @@ -524,7 +544,8 @@ public void ItAddsAnalyzerMetadataAndFileDependencies() { ProjectAssetsFile = lockFile.Path, ProjectPath = null, - ProjectLanguage = projectLanguage // set language + ProjectLanguage = projectLanguage, // set language + EmitLegacyAssetsFileItems = true }; task.Execute().Should().BeTrue(); @@ -608,7 +629,8 @@ public void ItFiltersAnalyzersByProjectLanguage() { ProjectAssetsFile = lockFile.Path, ProjectPath = null, - ProjectLanguage = projectLanguage // set language + ProjectLanguage = projectLanguage, // set language + EmitLegacyAssetsFileItems = true }; task.Execute().Should().BeTrue(); @@ -677,7 +699,7 @@ public void ItUsesResolvedPackageVersionFromSameTarget() projectFileDependencyGroups: new string[] { ProjectGroup, NETCoreGroup, NETCoreOsxGroup } ); - var task = GetExecutedTaskFromContents(lockFileContent); + var task = GetExecutedTaskFromContents(lockFileContent, out _); var chiDeps = task.PackageDependencies .Where(t => t.ItemSpec.StartsWith("Dep.Lib.Chi")); @@ -749,7 +771,7 @@ public void ItMarksTransitiveProjectReferences() } ); - var task = GetExecutedTaskFromContents(lockFileContent, out var lockFile); + var task = GetExecutedTaskFromContents(lockFileContent, out _); task.PackageDependencies.Count().Should().Be(6); @@ -766,31 +788,19 @@ public void ItMarksTransitiveProjectReferences() others.Where(t => t.ItemSpec == "ProjF/1.0.0").Count().Should().Be(1); } - private ResolvePackageDependencies GetExecutedTaskFromPrefix(string lockFilePrefix) - { - LockFile lockFile; - return GetExecutedTaskFromPrefix(lockFilePrefix, out lockFile); - } - - private ResolvePackageDependencies GetExecutedTaskFromPrefix(string lockFilePrefix, out LockFile lockFile) + private static ResolvePackageDependencies GetExecutedTaskFromPrefix(string lockFilePrefix, out LockFile lockFile, bool emitLegacyAssetsFileItems = true) { lockFile = TestLockFiles.GetLockFile(lockFilePrefix); - return GetExecutedTask(lockFile); - } - - private ResolvePackageDependencies GetExecutedTaskFromContents(string lockFileContents) - { - LockFile lockFile; - return GetExecutedTaskFromContents(lockFileContents, out lockFile); + return GetExecutedTask(lockFile, emitLegacyAssetsFileItems); } - private ResolvePackageDependencies GetExecutedTaskFromContents(string lockFileContents, out LockFile lockFile) + private static ResolvePackageDependencies GetExecutedTaskFromContents(string lockFileContents, out LockFile lockFile, bool emitLegacyAssetsFileItems = true) { lockFile = TestLockFiles.CreateLockFile(lockFileContents); - return GetExecutedTask(lockFile); + return GetExecutedTask(lockFile, emitLegacyAssetsFileItems); } - private ResolvePackageDependencies GetExecutedTask(LockFile lockFile) + private static ResolvePackageDependencies GetExecutedTask(LockFile lockFile, bool emitLegacyAssetsFileItems) { var resolver = new MockPackageResolver(_packageRoot); @@ -798,7 +808,8 @@ private ResolvePackageDependencies GetExecutedTask(LockFile lockFile) { ProjectAssetsFile = lockFile.Path, ProjectPath = _projectPath, - ProjectLanguage = null + ProjectLanguage = null, + EmitLegacyAssetsFileItems = emitLegacyAssetsFileItems }; task.Execute().Should().BeTrue(); @@ -806,4 +817,4 @@ private ResolvePackageDependencies GetExecutedTask(LockFile lockFile) return task; } } -} \ No newline at end of file +} diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeReportAssetsLogMessages.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeReportAssetsLogMessages.cs deleted file mode 100644 index 377703da8b24..000000000000 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeReportAssetsLogMessages.cs +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using NuGet.Common; -using NuGet.ProjectModel; -using System; -using System.Linq; -using Xunit; -using static Microsoft.NET.Build.Tasks.UnitTests.LockFileSnippets; - -namespace Microsoft.NET.Build.Tasks.UnitTests -{ - public class GivenThatWeReportAssetsLogMessages - { - [Fact] - public void ItReportsDiagnosticsWithMinimumData() - { - string lockFileContent = CreateDefaultLockFileSnippet( - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "Sample warning") - } - ); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().HaveCount(1); - } - - [Theory] - [InlineData(null)] - [InlineData(new object[] { new string[0] })] - public void ItReportsZeroDiagnosticsWithNoLogs(string [] logsJson) - { - string lockFileContent = CreateDefaultLockFileSnippet(logsJson); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().BeEmpty(); - } - - [Fact] - public void ItReportsDiagnosticsMetadataWithLogs() - { - string lockFileContent = CreateDefaultLockFileSnippet( - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Error, "Sample error", - filePath: "path/to/project.csproj", - libraryId: "LibA", - targetGraphs: new string[]{ ".NETCoreApp,Version=v1.0" }), - CreateLog(NuGetLogCode.NU1001, LogLevel.Warning, "Sample warning", - libraryId: "LibB", - targetGraphs: new string[]{ ".NETCoreApp,Version=v1.0" }) - } - ); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().HaveCount(2); - - Action checkMetadata = (key, val1, val2) => { - task.DiagnosticMessages - .Select(item => item.GetMetadata(key)) - .Should().Contain(new string[] { val1, val2 }); - }; - - checkMetadata(MetadataKeys.DiagnosticCode, "NU1000", "NU1001"); - checkMetadata(MetadataKeys.Severity, "Error", "Warning"); - checkMetadata(MetadataKeys.Message, "Sample error", "Sample warning"); - checkMetadata(MetadataKeys.FilePath, "", "path/to/project.csproj"); - checkMetadata(MetadataKeys.ParentTarget, ".NETCoreApp,Version=v1.0", ".NETCoreApp,Version=v1.0"); - checkMetadata(MetadataKeys.ParentPackage, "LibA/1.2.3", "LibB/1.2.3"); - } - - [Theory] - [InlineData(null, null, ".NETCoreApp,Version=v1.0", "")] - [InlineData(new string[] { ".NETCoreApp,Version=v1.0" }, null, ".NETCoreApp,Version=v1.0", "")] - [InlineData(null, "LibA", ".NETCoreApp,Version=v1.0", "LibA/1.2.3")] - [InlineData(new string[] { ".NETCoreApp,Version=v1.0" }, "LibA", ".NETCoreApp,Version=v1.0", "LibA/1.2.3")] - public void ItReportsDiagnosticsWithAllTargetLibraryCases(string[] targetGraphs, string libraryId, string expectedTarget, string expectedPackage) - { - string lockFileContent = CreateDefaultLockFileSnippet( - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "Sample warning", - filePath: "path/to/project.csproj", - libraryId: libraryId, - targetGraphs: targetGraphs) - } - ); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().HaveCount(1); - var item = task.DiagnosticMessages.First(); - - item.GetMetadata(MetadataKeys.ParentTarget).Should().Be(expectedTarget); - item.GetMetadata(MetadataKeys.ParentPackage).Should().Be(expectedPackage); - } - - [Fact] - public void ItHandlesInfoLogLevels() - { - string lockFileContent = CreateDefaultLockFileSnippet( - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Information, "Sample message"), - CreateLog(NuGetLogCode.NU1000, LogLevel.Minimal, "Sample message"), - CreateLog(NuGetLogCode.NU1000, LogLevel.Verbose, "Sample message"), - CreateLog(NuGetLogCode.NU1000, LogLevel.Debug, "Sample message"), - } - ); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().HaveCount(4); - - task.DiagnosticMessages - .Select(item => item.GetMetadata(MetadataKeys.Severity)) - .Should().OnlyContain(s => s == "Info"); - } - - [Theory] - [InlineData(new string[] { ".NETCoreApp,Version=v1.0", ".NETFramework,Version=v4.6.1" }, "LibA")] - [InlineData(new string[] { ".NETCoreApp,Version=v1.0" }, "LibA")] - public void ItHandlesMultiTFMScenarios(string[] targetGraphs, string libraryId) - { - string lockFileContent = CreateLockFileSnippet( - targets: new string[] { - CreateTarget(".NETCoreApp,Version=v1.0", TargetLibA, TargetLibB, TargetLibC), - CreateTarget(".NETFramework,Version=v4.6.1", TargetLibA, TargetLibB, TargetLibC), - }, - libraries: new string[] { LibADefn, LibBDefn, LibCDefn }, - projectFileDependencyGroups: new string[] { - ProjectGroup, NETCoreGroup, NET461Group - }, - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Warning, "Sample warning", - filePath: "path/to/project.csproj", - libraryId: libraryId, - targetGraphs: targetGraphs) - } - ); - - var task = GetExecutedTaskFromContents(lockFileContent); - - // a diagnostic for each target graph... - task.DiagnosticMessages.Should().HaveCount(targetGraphs.Length); - - task.DiagnosticMessages - .Select(item => item.GetMetadata(MetadataKeys.ParentTarget)) - .Should().Contain(targetGraphs); - - task.DiagnosticMessages - .Select(item => item.GetMetadata(MetadataKeys.ParentPackage)) - .Should().OnlyContain(v => v.StartsWith(libraryId)); - } - - [Fact] - public void ItSkipsInvalidEntries() - { - string lockFileContent = CreateDefaultLockFileSnippet( - logs: new string[] { - CreateLog(NuGetLogCode.NU1000, LogLevel.Error, "Sample error that will be invalid"), - CreateLog(NuGetLogCode.NU1001, LogLevel.Warning, "Sample warning"), - } - ); - lockFileContent = lockFileContent.Replace("NU1000", "CA1000"); - - var task = GetExecutedTaskFromContents(lockFileContent); - - task.DiagnosticMessages.Should().HaveCount(1); - - task.DiagnosticMessages - .Select(item => item.GetMetadata(MetadataKeys.DiagnosticCode)) - .Should().OnlyContain(v => v == "NU1001"); - } - - private static string CreateDefaultLockFileSnippet(string[] logs = null) => - CreateLockFileSnippet( - targets: new string[] { - CreateTarget(".NETCoreApp,Version=v1.0", TargetLibA, TargetLibB, TargetLibC), - }, - libraries: new string[] { LibADefn, LibBDefn, LibCDefn }, - projectFileDependencyGroups: new string[] { - ProjectGroup, NETCoreGroup - }, - logs: logs - ); - - private ReportAssetsLogMessages GetExecutedTaskFromContents(string lockFileContents) - { - var lockFile = TestLockFiles.CreateLockFile(lockFileContents); - return GetExecutedTask(lockFile); - } - - private ReportAssetsLogMessages GetExecutedTask(LockFile lockFile) - { - var task = new ReportAssetsLogMessages(lockFile) - { - ProjectAssetsFile = lockFile.Path, - }; - - task.Execute().Should().BeTrue(); - - return task; - } - } -} diff --git a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs index 8d94925b5ec6..a3140e0531fc 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks.UnitTests/GivenThatWeWantToGetDependenciesViaDesignTimeBuild.cs @@ -2,8 +2,6 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Collections.Generic; -using System.Linq; -using FluentAssertions; using Microsoft.Build.Framework; using Xunit; @@ -11,1296 +9,389 @@ namespace Microsoft.NET.Build.Tasks.UnitTests { public class GivenThatWeWantToGetDependenciesViaDesignTimeBuild { - [Fact] - public void ItShouldReturnOnlyValidTargetsWithoutRIDs() - { - // Arrange - // target definitions - var mockTargetWithType = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "target" } // lower case just in case - }); - - var mockTargetWithRidToBeSkipped = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5/win7x86", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "" }, - { MetadataKeys.TargetFrameworkMoniker, "" }, - { MetadataKeys.FrameworkName, "" }, - { MetadataKeys.FrameworkVersion, "" }, - { MetadataKeys.Type, ""} - }); - - var mockTargetWithoutType = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.6", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net46" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.6" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.6" }, - }); - - var mockTargetWithEmptyItemSpecToBeSkipped = new MockTaskItem( - itemSpec: "", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "" }, - { MetadataKeys.TargetFrameworkMoniker, "" }, - { MetadataKeys.FrameworkName, "" }, - { MetadataKeys.FrameworkVersion, "" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { - mockTargetWithType, - mockTargetWithRidToBeSkipped, - mockTargetWithoutType, - mockTargetWithEmptyItemSpecToBeSkipped - }; - task.PackageDefinitions = new ITaskItem[] { }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(1); - - var resultTargetsWithType = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargetsWithType.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTargetWithType, resultTargetsWithType[0]); - } - [Fact] public void ItShouldNotReturnPackagesWithUnknownTypes() { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackageNoType = new MockTaskItem( - itemSpec: "mockPackageNoType/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageNoType" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some path" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageUnknown = new MockTaskItem( - itemSpec: "mockPackageUnknown/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageUnknown" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "qqqq" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - // package dependencies - var mockPackageDepNoType = new MockTaskItem( - itemSpec: "mockPackageNoType/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageDepUnknown = new MockTaskItem( - itemSpec: "mockPackageUnknown/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { mockPackageNoType, mockPackageUnknown }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { mockPackageDepNoType, mockPackageDepUnknown }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - - // Act - var result = task.Execute(); + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = string.Empty, + PackageDefinitions = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "mockPackageNoType/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageNoType" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some path" } + }), + new MockTaskItem( + itemSpec: "mockPackageUnknown/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageUnknown" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "qqqq" } + }) + }, + PackageDependencies = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "mockPackageNoType/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageUnknown/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }) + } + }; - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(1); + Assert.True(task.Execute()); - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); + Assert.Empty(task.PackageDependenciesDesignTime); } [Fact] public void ItShouldReturnUnresolvedPackageDependenciesWithTypePackage() { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackageUnresolved = new MockTaskItem( - itemSpec: "mockPackageUnresolved/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageUnresolved" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "" }, - { MetadataKeys.Type, "Unresolved" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - // package dependencies - var mockPackageDepUnresolved = new MockTaskItem( - itemSpec: "mockPackageUnresolved/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { mockPackageUnresolved }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { mockPackageDepUnresolved }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(2); - - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); - - var resultPackageUnresolved = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/mockPackageUnresolved/1.0.0")).ToArray(); - resultPackageUnresolved.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockPackageUnresolved, resultPackageUnresolved[0]); - } - - [Fact] - public void ItShouldIgnoreAllDependenciesWithTypeNotEqualToPackageOrUnresolved() - { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackageExternalProject = new MockTaskItem( - itemSpec: "mockPackageExternalProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageExternalProject" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some path" }, - { MetadataKeys.Type, "ExternalProject" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageProject = new MockTaskItem( - itemSpec: "mockPackageProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageProject" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Project" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageContent = new MockTaskItem( - itemSpec: "mockPackageContent/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageContent" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Content" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageAssembly = new MockTaskItem( - itemSpec: "mockPackageAssembly/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageAssembly" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Assembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageFrameworkAssembly = new MockTaskItem( - itemSpec: "mockPackageFrameworkAssembly/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageFrameworkAssembly" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "FrameworkAssembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageDiagnostic = new MockTaskItem( - itemSpec: "mockPackageDiagnostic/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageDiagnostic" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Diagnostic" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageWinmd = new MockTaskItem( - itemSpec: "mockPackageWinmd/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageWinmd" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Winmd" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackageReference = new MockTaskItem( - itemSpec: "mockPackageReference/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockPackageReference" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Reference" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - // package dependencies - var mockPackageExternalProjectDep = new MockTaskItem( - itemSpec: "mockPackageExternalProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageProjectDep = new MockTaskItem( - itemSpec: "mockPackageProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageContentDep = new MockTaskItem( - itemSpec: "mockPackageContent/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageAssemblyDep = new MockTaskItem( - itemSpec: "mockPackageAssembly/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageFrameworkAssemblyDep = new MockTaskItem( - itemSpec: "mockPackageFrameworkAssembly/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageDiagnosticDep = new MockTaskItem( - itemSpec: "mockPackageDiagnostic/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageWinmdDep = new MockTaskItem( - itemSpec: "mockPackageWinmd/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageReferenceDep = new MockTaskItem( - itemSpec: "mockPackageReference/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { - mockPackageExternalProject, - mockPackageProject, - mockPackageContent, - mockPackageAssembly, - mockPackageFrameworkAssembly, - mockPackageWinmd, - mockPackageReference - }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { - mockPackageExternalProjectDep, - mockPackageProjectDep, - mockPackageContentDep, - mockPackageAssemblyDep, - mockPackageFrameworkAssemblyDep, - mockPackageWinmdDep, - mockPackageReferenceDep + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = string.Empty, + PackageDefinitions = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "mockPackageUnresolved/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageUnresolved" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "" }, + { MetadataKeys.Type, "Unresolved" } + }) + }, + PackageDependencies = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "mockPackageUnresolved/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }) + } }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - // Act - var result = task.Execute(); + Assert.True(task.Execute()); - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(1); + var item = Assert.Single(task.PackageDependenciesDesignTime); - // Target with type - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); + Assert.Equal("mockPackageUnresolved/1.0.0", item.ItemSpec); + Assert.Equal("mockPackageUnresolved", item.GetMetadata(MetadataKeys.Name)); + Assert.Equal("1.0.0", item.GetMetadata(MetadataKeys.Version)); + Assert.Equal("some path", item.GetMetadata(MetadataKeys.Path)); + Assert.Equal("", item.GetMetadata(MetadataKeys.ResolvedPath)); + Assert.False(item.GetBooleanMetadata(MetadataKeys.IsImplicitlyDefined)); + Assert.False(item.GetBooleanMetadata(PreprocessPackageDependenciesDesignTime.ResolvedMetadata)); } [Fact] - public void ItReturnsCorrectHierarchyOfDependenciesThatHaveChildren() + public void ItShouldIdentifyDefaultImplicitPackages() { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackage = new MockTaskItem( - itemSpec: "Package3/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "Package3" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { PreprocessPackageDependenciesDesignTime.DependenciesMetadata, "ChildPackage1/1.0.0;ChildPackage2/2.0.0" }, - { MetadataKeys.IsTopLevelDependency, "True" } - }); - - var mockChildPackage1 = new MockTaskItem( - itemSpec: "ChildPackage1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "ChildPackage1" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { PreprocessPackageDependenciesDesignTime.DependenciesMetadata, "ChildPackage11/1.0.0" }, - { MetadataKeys.IsTopLevelDependency, "False" } - }); - - var mockChildPackage11 = new MockTaskItem( - itemSpec: "ChildPackage11/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "ChildPackage11" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { MetadataKeys.IsTopLevelDependency, "False" } - }); - - var mockChildPackage2 = new MockTaskItem( - itemSpec: "ChildPackage2/2.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "ChildPackage2" }, - { MetadataKeys.Version, "2.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { MetadataKeys.IsTopLevelDependency, "False" } - }); - - // package dependencies - var mockPackageDep = new MockTaskItem( - itemSpec: "Package3/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockChildPackageDep1 = new MockTaskItem( - itemSpec: "ChildPackage1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" } - }); - - var mockChildPackageDep11 = new MockTaskItem( - itemSpec: "ChildPackage11/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "ChildPackage1/1.0.0" } - }); - - var mockChildPackageDep2 = new MockTaskItem( - itemSpec: "ChildPackage2/2.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { - mockPackage, - mockChildPackage1, - mockChildPackage11, - mockChildPackage2 - }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { - mockPackageDep, - mockChildPackageDep1, - mockChildPackageDep11, - mockChildPackageDep2 + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = "DefaultImplicit", + PackageDefinitions = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "DefaultImplicit/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "DefaultImplicit" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "" }, + { MetadataKeys.Type, "Package" } + }) + }, + PackageDependencies = new ITaskItem[] + { + new MockTaskItem( + itemSpec: "DefaultImplicit/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }) + } }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(5); - - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); - mockPackage.SetMetadata(MetadataKeys.Path, mockPackage.GetMetadata(MetadataKeys.ResolvedPath)); - var resultPackage = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/Package3/1.0.0")).ToArray(); - resultPackage.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockPackage, resultPackage[0]); + Assert.True(task.Execute()); - mockChildPackage1.SetMetadata(MetadataKeys.Path, mockChildPackage1.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildPackage1 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/ChildPackage1/1.0.0")).ToArray(); - resultChildPackage1.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockChildPackage1, resultChildPackage1[0]); + var item = Assert.Single(task.PackageDependenciesDesignTime); - mockChildPackage11.SetMetadata(MetadataKeys.Path, mockChildPackage11.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildPackage11 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/ChildPackage11/1.0.0")).ToArray(); - resultChildPackage11.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockChildPackage11, resultChildPackage11[0]); - - mockChildPackage2.SetMetadata(MetadataKeys.Path, mockChildPackage2.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildPackage2 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/ChildPackage2/2.0.0")).ToArray(); - resultChildPackage2.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockChildPackage2, resultChildPackage2[0]); + Assert.Equal("DefaultImplicit/1.0.0", item.ItemSpec); + Assert.True(item.GetBooleanMetadata(MetadataKeys.IsImplicitlyDefined)); } [Fact] - public void ItShouldIgnoreFileDependenciesThatAre_NotAssemblies_And_DontBelongToCompileTimeAssemblyGroup() + public void ItShouldIgnoreAllDependenciesWithTypeNotEqualToPackageOrUnresolved() { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockExternalProject = new MockTaskItem( - itemSpec: "mockExternalProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockExternalProject" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some path" }, - { MetadataKeys.Type, "ExternalProject" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockProject = new MockTaskItem( - itemSpec: "mockProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockProject" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Project" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockContent = new MockTaskItem( - itemSpec: "mockContent/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockContent" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Content" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockPackage = new MockTaskItem( - itemSpec: "mockPackage/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockAssembly" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Assembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockDiagnostic = new MockTaskItem( - itemSpec: "mockDiagnostic/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockDiagnostic" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Diagnostic" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockWinmd = new MockTaskItem( - itemSpec: "mockWinmd/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockWinmd" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Winmd" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - var mockReference = new MockTaskItem( - itemSpec: "mockReference/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockReference" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Reference" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "False" } - }); - - // package dependencies - var mockExternalProjectDep = new MockTaskItem( - itemSpec: "mockExternalProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockProjectDep = new MockTaskItem( - itemSpec: "mockProject/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockContentDep = new MockTaskItem( - itemSpec: "mockContent/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageDep = new MockTaskItem( - itemSpec: "mockPackage/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockDiagnosticDep = new MockTaskItem( - itemSpec: "mockDiagnostic/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockWinmdDep = new MockTaskItem( - itemSpec: "mockWinmd/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockReferenceDep = new MockTaskItem( - itemSpec: "mockReference/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { }; - task.FileDefinitions = new ITaskItem[] { - mockExternalProject, - mockProject, - mockContent, - mockPackage, - mockWinmd, - mockReference - }; - task.PackageDependencies = new ITaskItem[] { }; - task.FileDependencies = new ITaskItem[] { - mockExternalProjectDep, - mockProjectDep, - mockContentDep, - mockPackageDep, - mockWinmdDep, - mockReferenceDep + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = string.Empty, + PackageDefinitions = new ITaskItem[] { + new MockTaskItem( + itemSpec: "mockPackageExternalProject/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageExternalProject" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some path" }, + { MetadataKeys.Type, "ExternalProject" } + }), + new MockTaskItem( + itemSpec: "mockPackageProject/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageProject" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Project" } + }), + new MockTaskItem( + itemSpec: "mockPackageContent/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageContent" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Content" } + }), + new MockTaskItem( + itemSpec: "mockPackageAssembly/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageAssembly" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Assembly" } + }), + new MockTaskItem( + itemSpec: "mockPackageFrameworkAssembly/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageFrameworkAssembly" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "FrameworkAssembly" } + }), + new MockTaskItem( + itemSpec: "mockPackageDiagnostic/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageDiagnostic" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Diagnostic" } + }), + new MockTaskItem( + itemSpec: "mockPackageWinmd/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageWinmd" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Winmd" } + }), + new MockTaskItem( + itemSpec: "mockPackageReference/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "mockPackageReference" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Reference" } + }) + }, + PackageDependencies = new ITaskItem[] { + new MockTaskItem( + itemSpec: "mockPackageExternalProject/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageProject/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageContent/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageAssembly/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageFrameworkAssembly/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageDiagnostic/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageWinmd/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "mockPackageReference/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }) + } }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; - // Act - var result = task.Execute(); + Assert.True(task.Execute()); - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(1); - - // Target with type - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); + Assert.Empty(task.PackageDependenciesDesignTime); } [Fact] - public void ItShouldReturnCorrectHierarchyWhenPackageHasChildAssemblyOrAnalyzerDependencies() + public void ItShouldOnlyReturnPackagesInTheSpecifiedTarget() { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackage = new MockTaskItem( - itemSpec: "Package3/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "Package3" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { PreprocessPackageDependenciesDesignTime.DependenciesMetadata, - @"mockChildAssembly1;somepath/mockChildAssembly2;somepath/mockChildAnalyzerAssembly" }, - { MetadataKeys.IsImplicitlyDefined, "True" } - }); - - var mockPackage4 = new MockTaskItem( - itemSpec: "Package4/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "Package4" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { MetadataKeys.IsImplicitlyDefined, "True" } - }); - - var mockChildAssembly1 = new MockTaskItem( - itemSpec: @"mockChildAssembly1", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockChildAssembly1" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Assembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - var mockChildAssembly2 = new MockTaskItem( - itemSpec: @"somepath/mockChildAssembly2", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockChildAssembly2" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "FrameworkAssembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - var mockChildAssemblyNoCompileMetadata = new MockTaskItem( - itemSpec: @"somepath/mockChildAssemblyNoCompileMetadata", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockChildAssemblyNoCompileMetadata" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Assembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - var mockChildAnalyzerAssembly = new MockTaskItem( - itemSpec: @"somepath/mockChildAnalyzerAssembly", - metadata: new Dictionary - { - { MetadataKeys.Name, "mockChildAnalyzerAssembly" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "AnalyzerAssembly" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - // package dependencies - var mockPackageDep = new MockTaskItem( - itemSpec: "Package3/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockPackageDep4 = new MockTaskItem( - itemSpec: "Package4/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockChildAssemblyDep1 = new MockTaskItem( - itemSpec: "mockChildAssembly1", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" }, - { MetadataKeys.FileGroup, PreprocessPackageDependenciesDesignTime.CompileTimeAssemblyMetadata } - }); - - var mockChildAssemblyDep2 = new MockTaskItem( - itemSpec: @"somepath/mockChildAssembly2", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" }, - { MetadataKeys.FileGroup, PreprocessPackageDependenciesDesignTime.CompileTimeAssemblyMetadata } - }); - - var mockChildAssemblyNoCompileMetadataDep = new MockTaskItem( - itemSpec: "somepath/mockChildAssemblyNoCompileMetadata", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" } - }); - - var mockChildAnalyzerAssemblyDep = new MockTaskItem( - itemSpec: "somepath/mockChildAnalyzerAssembly", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package3/1.0.0" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget }; - task.PackageDefinitions = new ITaskItem[] { - mockPackage, - mockPackage4 - }; - task.FileDefinitions = new ITaskItem[] { - mockChildAssembly1, - mockChildAssembly2, - mockChildAssemblyNoCompileMetadata, - mockChildAnalyzerAssembly - }; - task.PackageDependencies = new ITaskItem[] { - mockPackageDep, - mockPackageDep4 - }; - task.FileDependencies = new ITaskItem[] { - mockChildAssemblyDep1, - mockChildAssemblyDep2, - mockChildAssemblyNoCompileMetadataDep, - mockChildAnalyzerAssemblyDep + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = string.Empty, + PackageDefinitions = new ITaskItem[] { + new MockTaskItem( + itemSpec: "Package1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "Package1" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "" }, + { MetadataKeys.Type, "Package" } + }), + new MockTaskItem( + itemSpec: "Package2/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "Package2" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "" }, + { MetadataKeys.Type, "Package" } + }) + }, + PackageDependencies = new ITaskItem[] { + new MockTaskItem( + itemSpec: "Package1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "Package2/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.6" } + }) + } }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = "Package3;Package4"; - task.TargetFrameworkMoniker = string.Empty; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(6); - - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Target, mockTarget, resultTargets[0]); - - mockPackage.SetMetadata(MetadataKeys.Path, mockPackage.GetMetadata(MetadataKeys.ResolvedPath)); - var resultPackage = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/Package3/1.0.0")).ToArray(); - resultPackage.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockPackage, resultPackage[0]); - - mockPackage4.SetMetadata(MetadataKeys.Path, mockPackage4.GetMetadata(MetadataKeys.ResolvedPath)); - var resultPackage4 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/Package4/1.0.0")).ToArray(); - resultPackage4.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Package, mockPackage4, resultPackage4[0]); - - mockChildAssembly1.SetMetadata(MetadataKeys.Path, mockChildAssembly1.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildAssembly1 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/mockChildAssembly1")).ToArray(); - resultChildAssembly1.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.Assembly, mockChildAssembly1, resultChildAssembly1[0]); - - mockChildAssembly2.SetMetadata(MetadataKeys.Path, mockChildAssembly2.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildAssembly2 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/somepath/mockChildAssembly2")).ToArray(); - resultChildAssembly2.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.FrameworkAssembly, mockChildAssembly2, resultChildAssembly2[0]); - - mockChildAnalyzerAssembly.SetMetadata(MetadataKeys.Path, mockChildAnalyzerAssembly.GetMetadata(MetadataKeys.ResolvedPath)); - var resultChildAnalyzerAssembly = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/somepath/mockChildAnalyzerAssembly")).ToArray(); - resultChildAnalyzerAssembly.Length.Should().Be(1); - VerifyTargetTaskItem(DependencyType.AnalyzerAssembly, mockChildAnalyzerAssembly, resultChildAnalyzerAssembly[0]); - } - - [Fact] - public void ItShouldReturnCorrectPackagesForCorrespondingTarget() - { - // Arrange - // target definitions - var mockTarget = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.5", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net45" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.5" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.5" }, - { MetadataKeys.Type, "Target" } - }); - - var mockTarget2 = new MockTaskItem( - itemSpec: ".Net Framework,Version=v4.6", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "net46" }, - { MetadataKeys.TargetFrameworkMoniker, ".Net Framework,Version=v4.6" }, - { MetadataKeys.FrameworkName, ".Net Framework" }, - { MetadataKeys.FrameworkVersion, "4.6" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var mockPackage1 = new MockTaskItem( - itemSpec: "Package1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "Package1" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - var mockChildPackage1 = new MockTaskItem( - itemSpec: "ChildPackage1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "ChildPackage1" }, - { MetadataKeys.Version, "1.0.0" }, - { MetadataKeys.Path, "some path" }, - { MetadataKeys.ResolvedPath, "some resolved path" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" }, - { MetadataKeys.IsTopLevelDependency, "False" } - }); - - // package dependencies - var mockPackageDep1 = new MockTaskItem( - itemSpec: "Package1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } - }); - - var mockChildPackageDep1 = new MockTaskItem( - itemSpec: "ChildPackage1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, - { MetadataKeys.ParentPackage, "Package1/1.0.0" } - }); - - var mockPackageDep2 = new MockTaskItem( - itemSpec: "Package1/1.0.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.6" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { mockTarget, mockTarget2 }; - task.PackageDefinitions = new ITaskItem[] { mockPackage1, mockChildPackage1 }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { mockPackageDep1, mockPackageDep2, mockChildPackageDep1 }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = string.Empty; + Assert.True(task.Execute()); - // Act - var result = task.Execute(); + var item = Assert.Single(task.PackageDependenciesDesignTime); - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(5); - - var resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5")).ToArray(); - resultTargets.Length.Should().Be(1); - - resultTargets = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.6")).ToArray(); - resultTargets.Length.Should().Be(1); - - var resultPackage1 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.5/Package1/1.0.0")).ToArray(); - resultPackage1.Length.Should().Be(1); - resultPackage1[0].GetMetadata(PreprocessPackageDependenciesDesignTime.DependenciesMetadata) - .Should().Be("ChildPackage1/1.0.0"); - - resultPackage1 = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".Net Framework,Version=v4.6/Package1/1.0.0")).ToArray(); - resultPackage1.Length.Should().Be(1); - resultPackage1[0].GetMetadata(PreprocessPackageDependenciesDesignTime.DependenciesMetadata) - .Should().Be(""); + Assert.Equal("Package1/1.0.0", item.ItemSpec); } [Fact] - public void ItShouldCreateDependenciesForReferencesWithNuGetMetadata() + public void ItShouldOnlyReturnTopLevelPackages() { - // Arrange - // target definitions - var netStandard20Target = new MockTaskItem( - itemSpec: ".NETStandard,Version=v2.0", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "netstandard2.0" }, - { MetadataKeys.TargetFrameworkMoniker, ".NETStandard,Version=v2.0" }, - { MetadataKeys.FrameworkName, ".NETStandard" }, - { MetadataKeys.FrameworkVersion, "2.0" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var myPackage = new MockTaskItem( - itemSpec: "MyPackage/1.5.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "MyPackage" }, - { MetadataKeys.Version, "1.5.0" }, - { MetadataKeys.Path, "Packages\\MyPackage\\1.5.0" }, - { MetadataKeys.ResolvedPath, "" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - // package dependencies - var myPackageDependency = new MockTaskItem( - itemSpec: "MyPackage/1.5.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".NETStandard,Version=v2.0" } - }); - - // references - var referenceWithMetadata = new MockTaskItem( - itemSpec: "Packages\\MyPackage\\1.5.0\\AnAssembly.dll", - metadata: new Dictionary - { - { "NuGetPackageId", "MyPackage" }, - { "NuGetPackageVersion", "1.5.0" } - }); - - var referenceWithoutMetadata = new MockTaskItem( - itemSpec: "Packages\\MyPackage\\1.5.0\\AnotherAssembly.dll", - metadata: new Dictionary()); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { netStandard20Target }; - task.PackageDefinitions = new ITaskItem[] { myPackage }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { myPackageDependency }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { referenceWithMetadata, referenceWithoutMetadata }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = ".NETStandard,Version=v2.0"; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(3); - - var resultPackage = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".NETStandard,Version=v2.0/MyPackage/1.5.0")).ToArray(); - resultPackage.Length.Should().Be(1); - resultPackage[0].GetMetadata(PreprocessPackageDependenciesDesignTime.DependenciesMetadata) - .Should().Be("MyPackage/1.5.0/AnAssembly.dll"); - } - - [Fact] - public void ItShouldMakeFacadeReferencesInvisible() - { - // Arrange - // target definitions - var netStandard20Target = new MockTaskItem( - itemSpec: ".NETStandard,Version=v2.0", - metadata: new Dictionary - { - { MetadataKeys.RuntimeIdentifier, "netstandard2.0" }, - { MetadataKeys.TargetFrameworkMoniker, ".NETStandard,Version=v2.0" }, - { MetadataKeys.FrameworkName, ".NETStandard" }, - { MetadataKeys.FrameworkVersion, "2.0" }, - { MetadataKeys.Type, "Target" } - }); - - // package definitions - var myPackage = new MockTaskItem( - itemSpec: "MyPackage/1.5.0", - metadata: new Dictionary - { - { MetadataKeys.Name, "MyPackage" }, - { MetadataKeys.Version, "1.5.0" }, - { MetadataKeys.Path, "Packages\\MyPackage\\1.5.0" }, - { MetadataKeys.ResolvedPath, "" }, - { MetadataKeys.Type, "Package" }, - { PreprocessPackageDependenciesDesignTime.ResolvedMetadata, "True" } - }); - - // package dependencies - var myPackageDependency = new MockTaskItem( - itemSpec: "MyPackage/1.5.0", - metadata: new Dictionary - { - { MetadataKeys.ParentTarget, ".NETStandard,Version=v2.0" } - }); - - // references - var alphaReference = new MockTaskItem( - itemSpec: "Packages\\MyPackage\\1.5.0\\AlphaAssembly.dll", - metadata: new Dictionary - { - { "NuGetPackageId", "MyPackage" }, - { "NuGetPackageVersion", "1.5.0" } - }); - - var betaReference = new MockTaskItem( - itemSpec: "Packages\\MyPackage\\1.5.0\\BetaAssembly.dll", - metadata: new Dictionary - { - { "NuGetPackageId", "MyPackage" }, - { "NuGetPackageVersion", "1.5.0" }, - { "Facade", "false" } - }); - - var gammaReference = new MockTaskItem( - itemSpec: "Packages\\MyPackage\\1.5.0\\GammaAssembly.dll", - metadata: new Dictionary - { - { "NuGetPackageId", "MyPackage" }, - { "NuGetPackageVersion", "1.5.0" }, - { "Facade", "true" } - }); - - var task = new PreprocessPackageDependenciesDesignTime(); - task.TargetDefinitions = new[] { netStandard20Target }; - task.PackageDefinitions = new ITaskItem[] { myPackage }; - task.FileDefinitions = new ITaskItem[] { }; - task.PackageDependencies = new ITaskItem[] { myPackageDependency }; - task.FileDependencies = new ITaskItem[] { }; - task.References = new ITaskItem[] { alphaReference, betaReference, gammaReference }; - task.DefaultImplicitPackages = string.Empty; - task.TargetFrameworkMoniker = ".NETStandard,Version=v2.0"; - - // Act - var result = task.Execute(); - - // Assert - result.Should().BeTrue(); - task.DependenciesDesignTime.Count().Should().Be(5); - - var alphaDependency = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".NETStandard,Version=v2.0/MyPackage/1.5.0/AlphaAssembly.dll")) - .Single(); - alphaDependency.GetBooleanMetadata(PreprocessPackageDependenciesDesignTime.VisibleMetadata) - .Should().BeTrue(); - - var betaDependency = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".NETStandard,Version=v2.0/MyPackage/1.5.0/BetaAssembly.dll")) - .Single(); - betaDependency.GetBooleanMetadata(PreprocessPackageDependenciesDesignTime.VisibleMetadata) - .Should().BeTrue(); - - var gammaDependency = task.DependenciesDesignTime - .Where(x => x.ItemSpec.Equals(".NETStandard,Version=v2.0/MyPackage/1.5.0/GammaAssembly.dll")) - .Single(); - gammaDependency.GetBooleanMetadata(PreprocessPackageDependenciesDesignTime.VisibleMetadata) - .Should().BeFalse(); - } - - private void VerifyTargetTaskItem(DependencyType type, ITaskItem input, ITaskItem output) - { - type.ToString().Should().Be(output.GetMetadata(MetadataKeys.Type)); + var task = new PreprocessPackageDependenciesDesignTime + { + TargetFrameworkMoniker = ".Net Framework,Version=v4.5", + DefaultImplicitPackages = string.Empty, + PackageDefinitions = new ITaskItem[] { + new MockTaskItem( + itemSpec: "Package1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "Package1" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "" }, + { MetadataKeys.Type, "Package" } + }), + new MockTaskItem( + itemSpec: "ChildPackage1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.Name, "ChildPackage1" }, + { MetadataKeys.Version, "1.0.0" }, + { MetadataKeys.Path, "some path" }, + { MetadataKeys.ResolvedPath, "some resolved path" }, + { MetadataKeys.Type, "Package" } + }) + }, + PackageDependencies = new ITaskItem[] { + new MockTaskItem( + itemSpec: "Package1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" } + }), + new MockTaskItem( + itemSpec: "ChildPackage1/1.0.0", + metadata: new Dictionary + { + { MetadataKeys.ParentTarget, ".Net Framework,Version=v4.5" }, + { MetadataKeys.ParentPackage, "Package1/1.0.0" } + }) + } + }; - // remove unnecessary metadata to keep only ones that would be in result task items - var removeMetadata = new[] { MetadataKeys.Type, MetadataKeys.ResolvedPath }; + Assert.True(task.Execute()); - foreach (var rm in removeMetadata) - { - output.RemoveMetadata(rm); - input.RemoveMetadata(rm); - } + var item = Assert.Single(task.PackageDependenciesDesignTime); - foreach (var metadata in input.MetadataNames) - { - input.GetMetadata(metadata.ToString()).Should().Be(output.GetMetadata(metadata.ToString())); - } + Assert.Equal("Package1/1.0.0", item.ItemSpec); } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/LoadAssetsFile.cs b/src/Tasks/Microsoft.NET.Build.Tasks/LoadAssetsFile.cs deleted file mode 100644 index d0c22c83f777..000000000000 --- a/src/Tasks/Microsoft.NET.Build.Tasks/LoadAssetsFile.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.NET.Build.Tasks -{ - public sealed class LoadAssetsFile : TaskBase - { - /// - /// The assets file to process - /// - public string ProjectAssetsFile - { - get; set; - } - - protected override void ExecuteCore() - { - var lockFile = new LockFileCache(this).GetLockFile(ProjectAssetsFile); - } - } -} diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/LockFileExtensions.cs b/src/Tasks/Microsoft.NET.Build.Tasks/LockFileExtensions.cs index f70be8866d63..a95beba36800 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/LockFileExtensions.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/LockFileExtensions.cs @@ -113,7 +113,7 @@ public static Dictionary GetProjectFileDependencies(this LockFil public static HashSet GetProjectFileDependencySet(this LockFile lockFile) { // Get package name from e.g. Microsoft.VSSDK.BuildTools >= 15.0.25604-Preview4 - string GetPackageNameFromDependency(string dependency) + static string GetPackageNameFromDependency(string dependency) { int indexOfWhiteSpace = IndexOfWhiteSpace(dependency); if (indexOfWhiteSpace < 0) @@ -124,7 +124,7 @@ string GetPackageNameFromDependency(string dependency) return dependency.Substring(0, indexOfWhiteSpace); } - int IndexOfWhiteSpace(string s) + static int IndexOfWhiteSpace(string s) { for (int i = 0; i < s.Length; i++) { diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs b/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs index aa602d74fff6..5e9fe997a33b 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/PreprocessPackageDependenciesDesignTime.cs @@ -2,702 +2,139 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; -using System.Collections; using System.Collections.Generic; -using System.IO; -using System.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace Microsoft.NET.Build.Tasks { /// - /// Task combines data returned from ResolvePackageDependencies into single items collection - /// that can be consumed by DesignTime build and contains all info needed to expand packages - /// dependency graph. - /// If any changes are made here, make sure corresponding changes are made to NuGetDependenciesSubTreeProvider - /// in roslyn-project-system repo and corresponding tests. + /// Filters and projects items produced by for consumption by + /// the dependencies tree, via design-time builds. /// + /// + /// Only top-level package references are retained (i.e. those referenced directly by the project, not + /// those only brought in transitively). + /// + /// Only package references applicable to are retained. + /// + /// Changes to the implementation of this class must be coordinated with PackageRuleHandler + /// in the dotnet/project-system repo. + /// public class PreprocessPackageDependenciesDesignTime : TaskBase { - public const string DependenciesMetadata = "Dependencies"; - public const string CompileTimeAssemblyMetadata = "CompileTimeAssembly"; public const string ResolvedMetadata = "Resolved"; - public const string VisibleMetadata = "Visible"; - - [Required] - public ITaskItem[] TargetDefinitions { get; set; } + /// + /// Information about each package in the project, with metadata: + /// - Name = "MetadataExtractor" + /// - Path = "metadataextractor/1.0.0" + /// - ResolvedPath = "C:\Users\drnoakes\.nuget\packages\metadataextractor\1.0.0" + /// - Type = "package" + /// - Version = "2.3.0" + /// [Required] public ITaskItem[] PackageDefinitions { get; set; } - [Required] - public ITaskItem[] FileDefinitions { get; set; } - + /// + /// Items with metadata "ParentTarget" and "ParentPackage", which allows determining the hierarchy of package references. + /// [Required] public ITaskItem[] PackageDependencies { get; set; } - [Required] - public ITaskItem[] FileDependencies { get; set; } - + /// + /// Eg: "Microsoft.NETCore.App;NETStandard.Library" + /// [Required] public string DefaultImplicitPackages { get; set; } - [Required] - public ITaskItem[] References { get; set; } - + /// + /// Eg: ".NETCoreApp,Version=v5.0". + /// Only packages targeting this framework will be returned. + /// [Required] public string TargetFrameworkMoniker { get; set; } - public ITaskItem[] InputDiagnosticMessages { get; set; } - [Output] - public ITaskItem[] DependenciesDesignTime { get; set; } - - private Dictionary Targets { get; set; } - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private Dictionary Packages { get; set; } - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private Dictionary Assemblies { get; set; } - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private Dictionary DiagnosticsMap { get; set; } - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private Dictionary DependenciesWorld { get; set; } - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - private HashSet ImplicitPackageReferences { get; set; } - - private ITaskItem[] ExistingReferenceItemDependencies { get; set; } + public ITaskItem[] PackageDependenciesDesignTime { get; private set; } protected override void ExecuteCore() { - ImplicitPackageReferences = GetImplicitPackageReferences(DefaultImplicitPackages); - - PopulateTargets(); - - PopulatePackages(); - - PopulateAssemblies(); - PopulateExistingReferenceItems(); - - InputDiagnosticMessages = InputDiagnosticMessages ?? Array.Empty(); - PopulateDiagnosticsMap(); - - AddDependenciesToTheWorld(Packages, PackageDependencies); - - AddDependenciesToTheWorld(Assemblies, FileDependencies, (item) => - { - // We keep analyzers and assemblies with CompileTimeAssembly metadata; skip everything else. - - ItemMetadata itemMetadata = null; - if (Assemblies.TryGetValue(item.ItemSpec, out itemMetadata) && - itemMetadata.Type == DependencyType.AnalyzerAssembly) - { - return false; - } - - var fileGroup = item.GetMetadata(MetadataKeys.FileGroup); - return string.IsNullOrEmpty(fileGroup) || !fileGroup.Equals(CompileTimeAssemblyMetadata); - }); - - AddDependenciesToTheWorld(Assemblies, ExistingReferenceItemDependencies); - - AddDependenciesToTheWorld(DiagnosticsMap, InputDiagnosticMessages); - - // prepare output collection: add corresponding metadata to ITaskItem based in item type - DependenciesDesignTime = DependenciesWorld.Select(itemKvp => - { - var newTaskItem = new TaskItem(itemKvp.Key); - foreach(var metadataKvp in itemKvp.Value.ToDictionary()) - { - newTaskItem.SetMetadata(metadataKvp.Key, metadataKvp.Value); - } - - return newTaskItem; - }).ToArray(); - } - - /// - /// Adds targets from TargetDefinitions to dependencies world dictionary - /// - private void PopulateTargets() - { - foreach (var targetDef in TargetDefinitions) - { - if (string.IsNullOrEmpty(targetDef.ItemSpec) || targetDef.ItemSpec.Contains("/")) - { - // skip "target/rid"s and only consume actual targets - continue; - } - - var dependencyType = GetDependencyType(targetDef.GetMetadata(MetadataKeys.Type)); - if (dependencyType != DependencyType.Target) - { - // keep only targets here - continue; - } - - var target = new TargetMetadata(targetDef); - - Targets[targetDef.ItemSpec] = target; - - // add target to the world now, since it does not have parents - DependenciesWorld[targetDef.ItemSpec] = target; - } - } - - /// - /// Adds packages from PackageDefinitions to the dependencies world dictionary. - /// - private void PopulatePackages() - { - foreach (var packageDef in PackageDefinitions) - { - var dependencyType = GetDependencyType(packageDef.GetMetadata(MetadataKeys.Type)); - if (dependencyType != DependencyType.Package && - dependencyType != DependencyType.Unresolved) - { - // we ignore all other dependency types since - // - assemblies we handle separately below - // - projects we don't care here, since they are sent to project system via other route - continue; - } + var implicitPackageReferences = GetImplicitPackageReferences(DefaultImplicitPackages); - var dependency = new PackageMetadata(packageDef); - dependency.IsImplicitlyDefined = ImplicitPackageReferences.Contains(dependency.Name); - - Packages[packageDef.ItemSpec] = dependency; - } - } - - /// - /// Adds assemblies, analyzers and framework assemblies from FileDefinitions to dependencies world dictionary. - /// - private void PopulateAssemblies() - { - foreach (var fileDef in FileDefinitions) - { - var dependencyType = GetDependencyType(fileDef.GetMetadata(MetadataKeys.Type)); - if (dependencyType != DependencyType.Assembly && - dependencyType != DependencyType.FrameworkAssembly && - dependencyType != DependencyType.AnalyzerAssembly) - { - continue; - } + // We have two types of data: + // + // 1) "PackageDependencies" which place a package in a given target/hierarchy + // 2) "PackageDefinitions" which provide general metadata about a package + // + // First, we scan PackageDependencies to build the set of packages in our target. - var name = Path.GetFileName(fileDef.ItemSpec); - var assembly = new AssemblyMetadata(dependencyType, fileDef, name); - Assemblies[fileDef.ItemSpec] = assembly; - } - } + var allowItemSpecs = new HashSet(StringComparer.OrdinalIgnoreCase); - /// - /// Update FileDefinitions and FileDependencies to pretend that certain Reference items - /// explicitly added by a .targets file in the NETStandard.Library are actually normal - /// package items. This allows them to show up properly under the "SDK" node in Solution - /// Explorer, rather than just under the "Assemblies" node. - /// - /// This is not meant to be a general mechanism for injecting files that can't be handled - /// through the normal NuGet package mechanisms. - /// - private void PopulateExistingReferenceItems() - { - var existingReferenceItemDependencies = new List(); - foreach (var reference in References) + foreach (var dependency in PackageDependencies) { - var packageName = reference.GetMetadata(MetadataKeys.NuGetPackageId); - var packageVersion = reference.GetMetadata(MetadataKeys.NuGetPackageVersion); - - // This is not a "pre-resolved" assembly; skip it. - if (packageName == null || packageVersion == null) - { - continue; - } - - // If we don't know about the specified package, skip it. - var packageId = $"{packageName}/{packageVersion}"; - if (!Packages.TryGetValue(packageId, out ItemMetadata packageItemMetadata)) - { - continue; - } - - // If the file isn't actually a part of the package, skip it. - var packageMetadata = (PackageMetadata)packageItemMetadata; - if (!reference.ItemSpec.StartsWith(packageMetadata.Path, StringComparison.OrdinalIgnoreCase)) + if (dependency.HasMetadataValue(MetadataKeys.ParentPackage)) { + // ignore non-top-level packages (those with ParentPackage) continue; } - var referenceRelativePath = reference.ItemSpec.Substring(packageMetadata.Path.Length).Trim('\\'); - var referenceKey = $"{packageId}/{referenceRelativePath.Replace('\\', '/')}"; + var target = dependency.GetMetadata(MetadataKeys.ParentTarget); - // If we already know about the assembly file, skip it. - if (Assemblies.TryGetValue(referenceKey, out ItemMetadata assemblyItemMetadata)) + if (!StringComparer.OrdinalIgnoreCase.Equals(target, TargetFrameworkMoniker)) { + // skip dependencies for other targets continue; } - // Create the appropriate metadata. - var name = Path.GetFileName(referenceKey); - var facadeMetadata = reference.GetBooleanMetadata("Facade"); - var visible = facadeMetadata.HasValue ? !facadeMetadata.Value : true; - var assembly = new ExistingReferenceItemMetadata(name, reference.ItemSpec, visible); - Assemblies[referenceKey] = assembly; - - // Create the file dependency. - existingReferenceItemDependencies.Add(new ExistingReferenceItemDependency( - referenceKey, - TargetFrameworkMoniker, - packageId)); + allowItemSpecs.Add(dependency.ItemSpec); } - ExistingReferenceItemDependencies = existingReferenceItemDependencies.ToArray(); - } + // Second, find PackageDefinitions that match our allowed item specs - private void PopulateDiagnosticsMap() - { - foreach (var diagnostic in InputDiagnosticMessages) - { - var metadata = new DiagnosticMetadata(diagnostic); - DiagnosticsMap[diagnostic.ItemSpec] = metadata; - } - } - - private DependencyType GetDependencyType(string dependencyTypeString) - { - var dependencyType = DependencyType.Unknown; - if (!string.IsNullOrEmpty(dependencyTypeString)) - { - Enum.TryParse(dependencyTypeString, /* ignoreCase */ true, out dependencyType); - } - - return dependencyType; - } + var outputItems = new List(allowItemSpecs.Count); - private void AddDependenciesToTheWorld(Dictionary items, - ITaskItem[] itemDependencies, - Func shouldSkipItemCheck = null) - { - foreach (var dependency in itemDependencies) + foreach (var packageDef in PackageDefinitions) { - var currentItemId = dependency.ItemSpec; - if (!items.Keys.Contains(currentItemId)) - { - // if this package definition does not even exist - skip it - continue; - } - - if (shouldSkipItemCheck != null && shouldSkipItemCheck(dependency)) + if (!allowItemSpecs.Contains(packageDef.ItemSpec)) { + // We are not interested in this definition (not top-level, or wrong target) continue; } - var parentTargetId = dependency.GetMetadata(MetadataKeys.ParentTarget) ?? string.Empty; - if (parentTargetId.Contains("/") || !Targets.Keys.Contains(parentTargetId)) - { - // skip "target/rid"s and only consume actual targets and ignore non-existent parent targets - continue; - } - - var parentPackageId = dependency.GetMetadata(MetadataKeys.ParentPackage) ?? string.Empty; - if (!string.IsNullOrEmpty(parentPackageId) && !Packages.Keys.Contains(parentPackageId)) + var dependencyType = GetDependencyType(packageDef.GetMetadata(MetadataKeys.Type)); + + if (dependencyType == DependencyType.Package || + dependencyType == DependencyType.Unresolved) { - // ignore non-existent parent packages - continue; - } - - var currentPackageUniqueId = $"{parentTargetId}/{currentItemId}"; - // add current package to dependencies world - var currentItem = GetItem(items, currentItemId); - DependenciesWorld[currentPackageUniqueId] = currentItem; + var name = packageDef.GetMetadata(MetadataKeys.Name); - // update parent - var parentDependencyId = $"{parentTargetId}/{parentPackageId}".Trim('/'); - ItemMetadata parentDependency = null; - if (DependenciesWorld.TryGetValue(parentDependencyId, out parentDependency)) - { - parentDependency.Dependencies.Add(currentItemId); - if (parentDependency.Type == DependencyType.Target) - { - currentItem.IsTopLevelDependency = true; - } - } - else - { - // Update parent's Dependencies count and make sure parent is in the dependencies world - if (!string.IsNullOrEmpty(parentPackageId)) - { - parentDependency = GetItem(Packages, parentPackageId); - } - else + if (string.IsNullOrEmpty(name)) { - parentDependency = GetItem(Targets, parentTargetId); - currentItem.IsTopLevelDependency = true; + // Name is required + continue; } - parentDependency.Dependencies.Add(currentItemId); - DependenciesWorld[parentDependencyId] = parentDependency; - } - } - } - - private ItemMetadata GetItem(Dictionary items, string id) - { - return Targets.Count > 1 ? items[id].Clone() : items[id]; - } - - private abstract class ItemMetadata - { - public ItemMetadata(DependencyType type, IList dependencies = null, bool isTopLevelDependency = false) - { - Type = type; - Dependencies = dependencies == null ? new List() : new List(dependencies); - IsTopLevelDependency = isTopLevelDependency; - } - - public DependencyType Type { get; protected set; } - public bool IsTopLevelDependency { get; set; } - - /// - /// A list of name/version strings to specify dependency identities. - /// Note: identity here is just a "name/version" and does not have TFM part in front. - /// - public List Dependencies { get; } - - /// - /// Returns name/value pairs for metadata specific to given item type's implementation. - /// - /// - public abstract IDictionary ToDictionary(); - - /// - /// Creates a copy of the item - /// - public abstract ItemMetadata Clone(); - } - - private class TargetMetadata : ItemMetadata - { - public TargetMetadata(ITaskItem item) - :base(DependencyType.Target) - { - RuntimeIdentifier = item.GetMetadata(MetadataKeys.RuntimeIdentifier) ?? string.Empty; - TargetFrameworkMoniker = item.GetMetadata(MetadataKeys.TargetFrameworkMoniker) ?? string.Empty; - FrameworkName = item.GetMetadata(MetadataKeys.FrameworkName) ?? string.Empty; - FrameworkVersion = item.GetMetadata(MetadataKeys.FrameworkVersion) ?? string.Empty; - } - - private TargetMetadata( - DependencyType type, - IList dependencies, - bool isTopLevelDependency, - string runtimeIdentifier, - string targetFrameworkMoniker, - string frameworkName, - string frameworkVersion) - : base(type, dependencies, isTopLevelDependency) - { - RuntimeIdentifier = runtimeIdentifier; - TargetFrameworkMoniker = targetFrameworkMoniker; - FrameworkName = frameworkName; - FrameworkVersion = frameworkVersion; - } - - public string RuntimeIdentifier { get; } - public string TargetFrameworkMoniker { get; } - public string FrameworkName { get; } - public string FrameworkVersion { get; } + var version = packageDef.GetMetadata(MetadataKeys.Version) ?? string.Empty; + var resolvedPath = packageDef.GetMetadata(MetadataKeys.ResolvedPath); + var resolved = !string.IsNullOrEmpty(resolvedPath); + var path = (resolved + ? resolvedPath + : packageDef.GetMetadata(MetadataKeys.Path)) ?? string.Empty; + var isImplicitlyDefined = implicitPackageReferences.Contains(name); - public override IDictionary ToDictionary() - { - return new Dictionary - { - { MetadataKeys.RuntimeIdentifier, RuntimeIdentifier }, - { MetadataKeys.TargetFrameworkMoniker, TargetFrameworkMoniker }, - { MetadataKeys.FrameworkName, FrameworkName }, - { MetadataKeys.FrameworkVersion, FrameworkVersion }, - { MetadataKeys.Type, Type.ToString() }, - { DependenciesMetadata, string.Join(";", Dependencies) } - }; - } - - public override ItemMetadata Clone() - { - return new TargetMetadata( - Type, - Dependencies, - IsTopLevelDependency, - RuntimeIdentifier, - TargetFrameworkMoniker, - FrameworkName, - FrameworkVersion); - } - } - - private class PackageMetadata : ItemMetadata - { - public PackageMetadata(ITaskItem item) - : base(DependencyType.Package) - { - Name = item.GetMetadata(MetadataKeys.Name) ?? string.Empty; - Version = item.GetMetadata(MetadataKeys.Version) ?? string.Empty; - Resolved = Type != DependencyType.Unknown && !string.IsNullOrEmpty(item.GetMetadata(MetadataKeys.ResolvedPath)); - Path = (Resolved - ? item.GetMetadata(MetadataKeys.ResolvedPath) - : item.GetMetadata(MetadataKeys.Path)) ?? string.Empty; - } - - protected PackageMetadata( - DependencyType type, - IList dependencies, - bool isTopLevelDependency, - string name, - string version, - string path, - bool resolved, - bool isImplicitlyDefined) - : base(type, dependencies, isTopLevelDependency) - { - Name = name; - Version = version; - Path = path; - Resolved = resolved; - IsImplicitlyDefined = isImplicitlyDefined; - } - - public string Name { get; protected set; } - public string Version { get; } - public string Path { get; } - public bool Resolved { get; } - public bool IsImplicitlyDefined { get; set; } + 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(ResolvedMetadata, resolved.ToString()); - public override IDictionary ToDictionary() - { - return new Dictionary - { - { MetadataKeys.Name, Name }, - { MetadataKeys.Version, Version }, - { MetadataKeys.Path, Path }, - { MetadataKeys.Type, Type.ToString() }, - { MetadataKeys.IsImplicitlyDefined, IsImplicitlyDefined.ToString() }, - { MetadataKeys.IsTopLevelDependency, IsTopLevelDependency.ToString() }, - { ResolvedMetadata, Resolved.ToString() }, - { DependenciesMetadata, string.Join(";", Dependencies) } - }; - } - - public override ItemMetadata Clone() - { - return new PackageMetadata( - Type, - Dependencies, - IsTopLevelDependency, - Name, - Version, - Path, - Resolved, - IsImplicitlyDefined); - } - } - - private class AssemblyMetadata : PackageMetadata - { - public AssemblyMetadata(DependencyType type, - ITaskItem item, - string name) - : base(item) - { - Name = name ?? string.Empty; - Type = type; - } - } - - /// - /// Represents metadata for a Reference item that we want to pretend was resolved as a - /// standard NuGet package assembly. - /// - private class ExistingReferenceItemMetadata : ItemMetadata - { - public ExistingReferenceItemMetadata(string name, string path, bool visible) - : base( - type: DependencyType.Assembly, - dependencies: null, - isTopLevelDependency: false) - { - Name = name; - Path = path; - Visible = visible; - } - - public string Name { get; } - public string Path { get; } - public bool Visible { get; } - - public override IDictionary ToDictionary() - { - return new Dictionary - { - { MetadataKeys.Name, Name }, - { MetadataKeys.Path, Path }, - { MetadataKeys.Type, Type.ToString() }, - { MetadataKeys.IsImplicitlyDefined, "false" }, - { MetadataKeys.IsTopLevelDependency, "false" }, - { ResolvedMetadata, "true" }, - { VisibleMetadata, Visible.ToString() }, - { DependenciesMetadata, string.Empty } - }; - } - - public override ItemMetadata Clone() - { - return new ExistingReferenceItemMetadata( - Name, - Path, - Visible); - } - } - - private sealed class DiagnosticMetadata : ItemMetadata - { - public DiagnosticMetadata(ITaskItem item) - : base(DependencyType.Diagnostic) - { - DiagnosticCode = item.GetMetadata(MetadataKeys.DiagnosticCode) ?? string.Empty; - Message = item.GetMetadata(MetadataKeys.Message) ?? string.Empty; - FilePath = item.GetMetadata(MetadataKeys.FilePath) ?? string.Empty; - Severity = item.GetMetadata(MetadataKeys.Severity) ?? string.Empty; - StartLine = item.GetMetadata(MetadataKeys.StartLine) ?? string.Empty; - StartColumn = item.GetMetadata(MetadataKeys.StartColumn) ?? string.Empty; - EndLine = item.GetMetadata(MetadataKeys.EndLine) ?? string.Empty; - EndColumn = item.GetMetadata(MetadataKeys.EndColumn) ?? string.Empty; - } - - private DiagnosticMetadata( - DependencyType type, - IList dependencies, - bool isTopLevelDependency, - string diagnosticCode, - string message, - string filePath, - string severity, - string startLine, - string startColumn, - string endLine, - string endColumn) - : base(type, dependencies, isTopLevelDependency) - { - DiagnosticCode = diagnosticCode; - Message = message; - FilePath = filePath; - Severity = severity; - StartLine = startLine; - StartColumn = startColumn; - EndLine = endLine; - EndColumn = endColumn; - } - - public string DiagnosticCode { get; } - public string Message { get; } - public string FilePath { get; } - public string Severity { get; } - public string StartLine { get; } - public string StartColumn { get; } - public string EndLine { get; } - public string EndColumn { get; } - - public override IDictionary ToDictionary() - { - return new Dictionary - { - { MetadataKeys.Name, Message }, - { MetadataKeys.DiagnosticCode, DiagnosticCode }, - { MetadataKeys.Message, Message }, - { MetadataKeys.FilePath, FilePath }, - { MetadataKeys.Severity, Severity }, - { MetadataKeys.StartLine, StartLine }, - { MetadataKeys.StartColumn, StartColumn }, - { MetadataKeys.EndLine, EndLine }, - { MetadataKeys.EndColumn, EndColumn }, - { MetadataKeys.Type, Type.ToString() }, - { DependenciesMetadata, string.Join(";", Dependencies) } - }; - } - - public override ItemMetadata Clone() - { - return new DiagnosticMetadata( - Type, - Dependencies, - IsTopLevelDependency, - DiagnosticCode, - Message, - FilePath, - Severity, - StartLine, - StartColumn, - EndLine, - EndColumn); - } - } - - /// - /// Represents the FileDependency metadata for a Reference item that we want to pretend was - /// resolved as a standard NuGet package assembly. - /// - private sealed class ExistingReferenceItemDependency : ITaskItem - { - private readonly Dictionary _metadata = new Dictionary(capacity: 3, comparer: StringComparer.OrdinalIgnoreCase); - - public ExistingReferenceItemDependency(string itemSpec, string parentTarget, string parentPackage) - { - ItemSpec = itemSpec; - _metadata[MetadataKeys.FileGroup] = CompileTimeAssemblyMetadata; - _metadata[MetadataKeys.ParentTarget] = parentTarget; - _metadata[MetadataKeys.ParentPackage] = parentPackage; - } - - public string ItemSpec { get; set; } - - public ICollection MetadataNames => _metadata.Keys; - - public int MetadataCount => _metadata.Count; - - public IDictionary CloneCustomMetadata() - { - return new Dictionary(_metadata, _metadata.Comparer); - } - - public void CopyMetadataTo(ITaskItem destinationItem) - { - foreach (var pair in _metadata) - { - destinationItem.SetMetadata(pair.Key, pair.Value); + outputItems.Add(outputItem); } } - public string GetMetadata(string metadataName) - { - if (_metadata.TryGetValue(metadataName, out string metadataValue)) - { - return metadataValue; - } - - return null; - } - - public void RemoveMetadata(string metadataName) - { - _metadata.Remove(metadataName); - } - - public void SetMetadata(string metadataName, string metadataValue) - { - _metadata[metadataName] = metadataValue; - } + PackageDependenciesDesignTime = outputItems.ToArray(); } internal static HashSet GetImplicitPackageReferences(string defaultImplicitPackages) @@ -709,7 +146,7 @@ internal static HashSet GetImplicitPackageReferences(string defaultImpli } var packageNames = defaultImplicitPackages.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - if (packageNames == null || packageNames.Length <= 0) + if (packageNames.Length == 0) { return implicitPackageReferences; } @@ -721,5 +158,11 @@ internal static HashSet GetImplicitPackageReferences(string defaultImpli return implicitPackageReferences; } + + private static DependencyType GetDependencyType(string dependencyTypeString) + { + Enum.TryParse(dependencyTypeString, ignoreCase: true, out DependencyType dependencyType); + return dependencyType; + } } } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ReportAssetsLogMessages.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ReportAssetsLogMessages.cs deleted file mode 100644 index 180ad7634eb7..000000000000 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ReportAssetsLogMessages.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.Build.Framework; -using NuGet.Common; -using NuGet.ProjectModel; -using System.Linq; - -namespace Microsoft.NET.Build.Tasks -{ - /// - /// Raise log messages in the assets file as DiagnosticMessage items - /// that can be consumed downstream (e.g. by the dependency node in - /// the solution explorer) - /// - public sealed class ReportAssetsLogMessages : TaskBase - { - private LockFile _lockFile; - private DiagnosticsHelper _diagnostics; - - #region Outputs - - [Output] - public ITaskItem[] DiagnosticMessages => _diagnostics.GetDiagnosticMessages(); - - #endregion - - #region Inputs - - /// - /// The assets file to process - /// - public string ProjectAssetsFile - { - get; set; - } - - #endregion - - public ReportAssetsLogMessages() - { - _diagnostics = new DiagnosticsHelper(); - } - - #region Test Support - - internal ReportAssetsLogMessages(LockFile lockFile) : this() - { - _lockFile = lockFile; - } - - #endregion - - private LockFile LockFile - { - get - { - if (_lockFile == null) - { - _lockFile = new LockFileCache(this).GetLockFile(ProjectAssetsFile); - } - - return _lockFile; - } - } - - protected override void ExecuteCore() - { - foreach (var message in LockFile.LogMessages) - { - AddMessage(message); - } - } - - private void AddMessage(IAssetsLogMessage message) - { - var targetGraphs = message.GetTargetGraphs(LockFile); - - targetGraphs = targetGraphs.Any() ? targetGraphs : new LockFileTarget[] { null }; - - foreach (var target in targetGraphs) - { - var targetLib = message.LibraryId == null ? null : target?.GetTargetLibrary(message.LibraryId); - - _diagnostics.Add( - message.Code.ToString(), - message.Message, - message.FilePath, - FromLogLevel(message.Level), - message.StartLineNumber, - message.StartColumnNumber, - message.EndLineNumber, - message.EndColumnNumber, - target?.Name, - targetLib == null ? null : $"{targetLib.Name}/{targetLib.Version.ToNormalizedString()}"); - } - } - - private static DiagnosticMessageSeverity FromLogLevel(LogLevel level) - { - switch (level) - { - case LogLevel.Error: - return DiagnosticMessageSeverity.Error; - - case LogLevel.Warning: - return DiagnosticMessageSeverity.Warning; - - case LogLevel.Debug: - case LogLevel.Verbose: - case LogLevel.Information: - case LogLevel.Minimal: - default: - return DiagnosticMessageSeverity.Info; - } - } - } -} diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs index cd885abb656d..0eea24fceb40 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageDependencies.cs @@ -17,7 +17,11 @@ namespace Microsoft.NET.Build.Tasks /// public sealed class ResolvePackageDependencies : TaskBase { + /// + /// Only used if is . + /// private readonly Dictionary _fileTypes = new Dictionary(StringComparer.OrdinalIgnoreCase); + private HashSet _projectFileDependencies; private IPackageResolver _packageResolver; private LockFile _lockFile; @@ -32,6 +36,7 @@ public sealed class ResolvePackageDependencies : TaskBase /// /// All the targets in the lock file. + /// Only populated if is . /// [Output] public ITaskItem[] TargetDefinitions @@ -49,7 +54,8 @@ public ITaskItem[] PackageDefinitions } /// - /// All the files in the lock file + /// All the files in the lock file. + /// Only populated if is . /// [Output] public ITaskItem[] FileDefinitions @@ -58,7 +64,7 @@ public ITaskItem[] FileDefinitions } /// - /// All the dependencies between packages. Each package has metadata 'ParentPackage' + /// All the dependencies between packages. Each package has metadata 'ParentPackage' /// to refer to the package that depends on it. For top level packages this value is blank. /// [Output] @@ -69,7 +75,8 @@ public ITaskItem[] PackageDependencies /// /// All the dependencies between files and packages, labeled by the group containing - /// the file (e.g. CompileTimeAssembly, RuntimeAssembly, etc.) + /// the file (e.g. CompileTimeAssembly, RuntimeAssembly, etc.). + /// Only populated if is . /// [Output] public ITaskItem[] FileDependencies @@ -106,6 +113,12 @@ public string ProjectLanguage get; set; } + /// + /// Setting this property restores pre-16.7 behaviour of populating , + /// and outputs. + /// + public bool EmitLegacyAssetsFileItems { get; set; } = false; + #endregion public ResolvePackageDependencies() @@ -123,31 +136,9 @@ internal ResolvePackageDependencies(LockFile lockFile, IPackageResolver packageR #endregion - private IPackageResolver PackageResolver - { - get - { - if (_packageResolver == null) - { - _packageResolver = NuGetPackageResolver.CreateResolver(LockFile); - } - - return _packageResolver; - } - } - - private LockFile LockFile - { - get - { - if (_lockFile == null) - { - _lockFile = new LockFileCache(this).GetLockFile(ProjectAssetsFile); - } + private IPackageResolver PackageResolver => _packageResolver ??= NuGetPackageResolver.CreateResolver(LockFile); - return _lockFile; - } - } + private LockFile LockFile => _lockFile ??= new LockFileCache(this).GetLockFile(ProjectAssetsFile); /// /// Raise Nuget LockFile representation to MSBuild items @@ -167,13 +158,12 @@ private void ReadProjectFileDependencies() // get library and file definitions private void GetPackageAndFileDefinitions() { - TaskItem item; foreach (var package in LockFile.Libraries) { var packageName = package.Name; var packageVersion = package.Version.ToNormalizedString(); string packageId = $"{packageName}/{packageVersion}"; - item = new TaskItem(packageId); + var item = new TaskItem(packageId); item.SetMetadata(MetadataKeys.Name, packageName); item.SetMetadata(MetadataKeys.Type, package.Type); item.SetMetadata(MetadataKeys.Version, packageVersion); @@ -185,6 +175,11 @@ private void GetPackageAndFileDefinitions() _packageDefinitions.Add(item); + if (!EmitLegacyAssetsFileItems) + { + continue; + } + foreach (var file in package.Files) { if (NuGetUtils.IsPlaceholderFile(file)) @@ -222,8 +217,7 @@ private void GetPackageAndFileDefinitions() else { // get a type for the file if one is available - string fileType; - if (!_fileTypes.TryGetValue(fileKey, out fileType)) + if (!_fileTypes.TryGetValue(fileKey, out string fileType)) { fileType = "unknown"; } @@ -238,17 +232,19 @@ private void GetPackageAndFileDefinitions() // get target definitions and package and file dependencies private void RaiseLockFileTargets() { - TaskItem item; foreach (var target in LockFile.Targets) { - item = new TaskItem(target.Name); - item.SetMetadata(MetadataKeys.RuntimeIdentifier, target.RuntimeIdentifier ?? string.Empty); - item.SetMetadata(MetadataKeys.TargetFrameworkMoniker, target.TargetFramework.DotNetFrameworkName); - item.SetMetadata(MetadataKeys.FrameworkName, target.TargetFramework.Framework); - item.SetMetadata(MetadataKeys.FrameworkVersion, target.TargetFramework.Version.ToString()); - item.SetMetadata(MetadataKeys.Type, "target"); - - _targetDefinitions.Add(item); + if (EmitLegacyAssetsFileItems) + { + TaskItem item = new TaskItem(target.Name); + item.SetMetadata(MetadataKeys.RuntimeIdentifier, target.RuntimeIdentifier ?? string.Empty); + item.SetMetadata(MetadataKeys.TargetFrameworkMoniker, target.TargetFramework.DotNetFrameworkName); + item.SetMetadata(MetadataKeys.FrameworkName, target.TargetFramework.Framework); + item.SetMetadata(MetadataKeys.FrameworkVersion, target.TargetFramework.Version.ToString()); + item.SetMetadata(MetadataKeys.Type, "target"); + + _targetDefinitions.Add(item); + } // raise each library in the target GetPackageAndFileDependencies(target); @@ -265,15 +261,14 @@ private void GetPackageAndFileDependencies(LockFileTarget target) .Where(lib => lib.IsTransitiveProjectReference(LockFile, ref _projectFileDependencies)) .Select(pkg => pkg.Name), StringComparer.OrdinalIgnoreCase); - - TaskItem item; + foreach (var package in target.Libraries) { string packageId = $"{package.Name}/{package.Version.ToNormalizedString()}"; if (_projectFileDependencies.Contains(package.Name)) { - item = new TaskItem(packageId); + TaskItem item = new TaskItem(packageId); item.SetMetadata(MetadataKeys.ParentTarget, target.Name); // Foreign Key item.SetMetadata(MetadataKeys.ParentPackage, string.Empty); // Foreign Key @@ -283,8 +278,11 @@ private void GetPackageAndFileDependencies(LockFileTarget target) // get sub package dependencies GetPackageDependencies(package, target.Name, resolvedPackageVersions, transitiveProjectRefs); - // get file dependencies on this package - GetFileDependencies(package, target.Name); + if (EmitLegacyAssetsFileItems) + { + // get file dependencies on this package + GetFileDependencies(package, target.Name); + } } } @@ -295,18 +293,16 @@ private void GetPackageDependencies( HashSet transitiveProjectRefs) { string packageId = $"{package.Name}/{package.Version.ToNormalizedString()}"; - TaskItem item; foreach (var deps in package.Dependencies) { - string version; - if (!resolvedPackageVersions.TryGetValue(deps.Id, out version)) + if (!resolvedPackageVersions.TryGetValue(deps.Id, out string version)) { continue; } string depsName = $"{deps.Id}/{version}"; - item = new TaskItem(depsName); + TaskItem item = new TaskItem(depsName); item.SetMetadata(MetadataKeys.ParentTarget, targetName); // Foreign Key item.SetMetadata(MetadataKeys.ParentPackage, packageId); // Foreign Key @@ -332,7 +328,7 @@ private void GetFileDependencies(LockFileTargetLibrary package, string targetNam string filePath = entry.Item1; IDictionary properties = entry.Item2; - if (NuGetUtils.IsPlaceholderFile(filePath)) + if (NuGetUtils.IsPlaceholderFile(filePath) || !EmitLegacyAssetsFileItems) { continue; } @@ -370,8 +366,7 @@ private void SaveFileKeyType(string fileKey, FileGroup fileGroup) string fileType = fileGroup.GetTypeMetadata(); if (fileType != null) { - string currentFileType; - if (!_fileTypes.TryGetValue(fileKey, out currentFileType)) + if (!_fileTypes.TryGetValue(fileKey, out string currentFileType)) { _fileTypes.Add(fileKey, fileType); } @@ -401,18 +396,29 @@ private string ResolvePackagePath(LockFileLibrary package) } } - private string ResolveFilePath(string relativePath, string resolvedPackagePath) + private static string ResolveFilePath(string relativePath, string resolvedPackagePath) { if (NuGetUtils.IsPlaceholderFile(relativePath)) { return null; } + + if (resolvedPackagePath == null) + { + return string.Empty; + } + + if (Path.DirectorySeparatorChar != '/') + { + relativePath = relativePath.Replace('/', Path.DirectorySeparatorChar); + } + + if (Path.DirectorySeparatorChar != '\\') + { + relativePath = relativePath.Replace('\\', Path.DirectorySeparatorChar); + } - relativePath = relativePath.Replace('/', Path.DirectorySeparatorChar); - relativePath = relativePath.Replace('\\', Path.DirectorySeparatorChar); - return resolvedPackagePath != null - ? Path.Combine(resolvedPackagePath, relativePath) - : string.Empty; + return Path.Combine(resolvedPackagePath, relativePath); } private string GetAbsolutePathFromProjectRelativePath(string path) 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 083d70564ad7..98e5ed94f261 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets @@ -48,6 +48,10 @@ Copyright (c) .NET Foundation. All rights reserved. $(TargetFrameworkMoniker) true + + + false @@ -168,8 +172,7 @@ Copyright (c) .NET Foundation. All rights reserved. the Visual Studio error list when a project is created before NuGet restore has run and created the assets file. --> + Condition=" '$(DesignTimeBuild)' != 'true' Or Exists('$(ProjectAssetsFile)')"> + + @@ -299,21 +305,16 @@ Copyright (c) .NET Foundation. All rights reserved. AssemblyFile="$(MicrosoftNETBuildTasksAssembly)" /> - + @@ -401,41 +402,6 @@ Copyright (c) .NET Foundation. All rights reserved. - - - - - - - - - - - - - - - - - -