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(); + } } }