From 7af4517bbcf17b000889c1077ef5976f2b6350ea Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Thu, 25 Apr 2019 18:00:46 -0700 Subject: [PATCH] Fix KeyNotFoundException in GenerateDepsFile task (#3179) * Fix KeyNotFoundException in GenerateDepsFile task This would occur when there was a library in the assets file with a dependency on a library that wasn't in the assets file. Fixes #3159 --- .../DependencyContextBuilder2.cs | 12 +++++-- ...nThatWeWantToExcludeAPackageFromPublish.cs | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder2.cs b/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder2.cs index c3a04d6083a8..6646e0c1615f 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder2.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/DependencyContextBuilder2.cs @@ -766,10 +766,16 @@ private void CalculateExcludedLibraries() var dependencyName = dependenciesToWalk.Pop(); if (!includedDependencies.ContainsKey(dependencyName)) { - includedDependencies.Add(dependencyName, _dependencyLibraries[dependencyName]); - foreach (var newDependency in _libraryDependencies[dependencyName]) + // There may not be a library in the assets file if a referenced project has + // PrivateAssets="all" for a package reference, and there is a package in the graph + // that depends on the same packge. + if (_dependencyLibraries.TryGetValue(dependencyName, out var dependencyLibrary)) { - dependenciesToWalk.Push(newDependency.Name); + includedDependencies.Add(dependencyName, dependencyLibrary); + foreach (var newDependency in _libraryDependencies[dependencyName]) + { + dependenciesToWalk.Push(newDependency.Name); + } } } } diff --git a/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToExcludeAPackageFromPublish.cs b/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToExcludeAPackageFromPublish.cs index 1cb4b9b86746..67e81527e2ab 100644 --- a/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToExcludeAPackageFromPublish.cs +++ b/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToExcludeAPackageFromPublish.cs @@ -12,6 +12,7 @@ using System.Xml.Linq; using Xunit.Abstractions; using System.Collections.Generic; +using Microsoft.NET.TestFramework.ProjectConstruction; namespace Microsoft.NET.Publish.Tests { @@ -166,5 +167,37 @@ public void It_publishes_a_PackageReference_with_PrivateAssets_All_and_Publish_t publishDirectory.Should().OnlyHaveFiles(expectedFiles); } + + [Fact] + public void TransitiveNetStandardPackageReferenceAndPublishFalse() + { + var testLibraryProject = new TestProject() + { + Name = "TestLibrary", + IsSdkProject = true, + TargetFrameworks = "netstandard2.0" + }; + + testLibraryProject.PackageReferences.Add(new TestPackageReference("WindowsAzure.Storage", "9.3.3")); + + var testProject = new TestProject() + { + Name = "TestApp", + IsSdkProject = true, + IsExe = true, + TargetFrameworks = "netcoreapp3.0" + }; + + testProject.PackageReferences.Add(new TestPackageReference("Newtonsoft.Json", "12.0.2", privateAssets: "all")); + + testProject.ReferencedProjects.Add(testLibraryProject); + + var testAsset = _testAssetsManager.CreateTestProject(testProject) + .Restore(Log, testProject.Name); + + var publishCommand = new PublishCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + + publishCommand.Execute().Should().Pass(); + } } }