Skip to content

Commit 25ad186

Browse files
authored
Don't publish PrivateAssets Fixes #39400 (#45259)
2 parents 152a5d2 + f5ce52e commit 25ad186

File tree

6 files changed

+81
-3
lines changed

6 files changed

+81
-3
lines changed

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ internal class DependencyContextBuilder
2222
private Dictionary<string, List<ReferenceInfo>> _compileReferences;
2323
private Dictionary<string, List<ResolvedFile>> _resolvedNuGetFiles;
2424
private Dictionary<string, SingleProjectInfo> _referenceProjectInfos;
25+
private IEnumerable<string> _excludeFromPublishPackageIds;
2526
private Dictionary<string, List<RuntimePackAssetInfo>> _runtimePackAssets;
2627
private CompilationOptions _compilationOptions;
2728
private string _referenceAssembliesPath;
@@ -204,6 +205,12 @@ public DependencyContextBuilder WithReferenceProjectInfos(Dictionary<string, Sin
204205
return this;
205206
}
206207

208+
public DependencyContextBuilder WithExcludeFromPublishAssets(IEnumerable<string> excludeFromPublishPackageIds)
209+
{
210+
_excludeFromPublishPackageIds = excludeFromPublishPackageIds;
211+
return this;
212+
}
213+
207214
public DependencyContextBuilder WithMainProjectInDepsFile(bool includeMainProjectInDepsFile)
208215
{
209216
_includeMainProjectInDepsFile = includeMainProjectInDepsFile;
@@ -814,6 +821,37 @@ private void CalculateExcludedLibraries()
814821
{
815822
_dependencyLibraries[packageToExcludeFromRuntime].ExcludeFromRuntime = true;
816823
}
824+
825+
// Include transitive dependencies of all top-level dependencies
826+
Dictionary<string, DependencyLibrary> includedDependencies = new(StringComparer.OrdinalIgnoreCase);
827+
Stack<string> dependencyListToWalk = new(_mainProjectDependencies);
828+
829+
while (dependencyListToWalk.Count != 0)
830+
{
831+
var dependencyName = dependencyListToWalk.Pop();
832+
// There may not be a library in the assets file if a referenced project has
833+
// PrivateAssets="all" for a package reference, and there is a package in the graph
834+
// that depends on the same package.
835+
if (!includedDependencies.ContainsKey(dependencyName) &&
836+
_excludeFromPublishPackageIds?.Contains(dependencyName) != true &&
837+
_dependencyLibraries.TryGetValue(dependencyName, out var dependencyLibrary))
838+
{
839+
includedDependencies.Add(dependencyName, dependencyLibrary);
840+
foreach (var newDependency in _libraryDependencies[dependencyName])
841+
{
842+
dependencyListToWalk.Push(newDependency.Name);
843+
}
844+
}
845+
}
846+
847+
foreach (var dependencyLibrary in _dependencyLibraries.Values)
848+
{
849+
if (!includedDependencies.ContainsKey(dependencyLibrary.Name))
850+
{
851+
dependencyLibrary.ExcludeFromCompilation = true;
852+
dependencyLibrary.ExcludeFromRuntime = true;
853+
}
854+
}
817855
}
818856

819857
private string GetReferenceLibraryName(ReferenceInfo reference)

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public class GenerateDepsFile : TaskBase
6464

6565
public ITaskItem CompilerOptions { get; set; }
6666

67+
public ITaskItem[] ExcludeFromPublishPackageReferences { get; set; } = Array.Empty<ITaskItem>();
68+
6769
public ITaskItem[] RuntimeStorePackages { get; set; }
6870

6971
// NuGet compilation assets
@@ -232,6 +234,7 @@ bool ShouldIncludeRuntimeAsset(ITaskItem item)
232234
.WithDirectReferences(directReferences)
233235
.WithDependencyReferences(dependencyReferences)
234236
.WithReferenceProjectInfos(referenceProjects)
237+
.WithExcludeFromPublishAssets(PackageReferenceConverter.GetPackageIds(ExcludeFromPublishPackageReferences))
235238
.WithRuntimePackAssets(runtimePackAssets)
236239
.WithCompilationOptions(compilationOptions)
237240
.WithReferenceAssembliesPath(FrameworkReferenceResolver.GetDefaultReferenceAssembliesPath())

src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Publish.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,6 +1236,7 @@ Copyright (c) .NET Foundation. All rights reserved.
12361236
PlatformLibraryName="$(MicrosoftNETPlatformLibrary)"
12371237
RuntimeFrameworks="@(RuntimeFramework)"
12381238
CompilerOptions="@(DependencyFileCompilerOptions)"
1239+
ExcludeFromPublishPackageReferences="@(_ExcludeFromPublishPackageReference)"
12391240
RuntimeStorePackages="@(RuntimeStorePackages)"
12401241
CompileReferences="@(ResolvedCompileFileDefinitions)"
12411242
ResolvedNuGetFiles="@(_ResolvedNuGetFilesForPublish)"

src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.targets

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ Copyright (c) .NET Foundation. All rights reserved.
338338
PlatformLibraryName="$(MicrosoftNETPlatformLibrary)"
339339
RuntimeFrameworks="@(RuntimeFramework)"
340340
CompilerOptions="@(DependencyFileCompilerOptions)"
341+
ExcludeFromPublishPackageReferences="@(_ExcludeFromPublishPackageReference)"
341342
CompileReferences="@(ResolvedCompileFileDefinitions)"
342343
ResolvedNuGetFiles="@(NativeCopyLocalItems);@(ResourceCopyLocalItems);@(RuntimeCopyLocalItems)"
343344
UserRuntimeAssemblies="@(UserRuntimeAssembly)"

test/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildADesktopLibrary.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,32 @@ public void It_can_preserve_compilation_context_and_reference_netstandard_librar
225225
}
226226
}
227227

228+
[Theory]
229+
[InlineData("RazorSimpleMvc22", "netcoreapp2.2", "SimpleMvc22")]
230+
[InlineData("DesktopReferencingNetStandardLibrary", "net46", "Library")]
231+
public void PackageReferences_with_private_assets_do_not_appear_in_deps_file(string asset, string targetFramework, string exeName)
232+
{
233+
var testAsset = _testAssetsManager
234+
.CopyTestAsset(asset)
235+
.WithSource();
236+
237+
var buildCommand = new BuildCommand(testAsset);
238+
buildCommand.Execute().Should().Pass();
239+
240+
using (var depsJsonFileStream = File.OpenRead(Path.Combine(buildCommand.GetOutputDirectory(targetFramework).FullName, exeName + ".deps.json")))
241+
{
242+
var dependencyContext = new DependencyContextJsonReader().Read(depsJsonFileStream);
243+
if (asset.Equals("DesktopReferencingNetStandardLibrary"))
244+
{
245+
dependencyContext.CompileLibraries.Any(l => l.Name.Equals("Library")).Should().BeTrue();
246+
}
247+
else
248+
{
249+
dependencyContext.CompileLibraries.Any(l => l.Name.Equals("Microsoft.AspNetCore.App")).Should().BeFalse();
250+
}
251+
}
252+
}
253+
228254
[WindowsOnlyFact]
229255
public void It_resolves_assembly_conflicts_with_a_NETFramework_library()
230256
{

test/Microsoft.NET.Sdk.Razor.Tests/MvcBuildIntegrationTestLegacy.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,18 @@ public void Build_ProducesDepsFileWithCompilationContext_ButNoReferences()
113113
depsFile.Should().Exist();
114114
var dependencyContext = ReadDependencyContext(depsFile.FullName);
115115

116-
// Ensure some compile references exist
117-
var packageReference = dependencyContext.CompileLibraries.First(l => l.Name == "System.Runtime.CompilerServices.Unsafe");
118-
packageReference.Assemblies.Should().NotBeEmpty();
116+
if (TargetFramework.Equals("netcoreapp2.2"))
117+
{
118+
// Ensure compile references from a PrivateAssets="all" PackageReference don't exist
119+
var packageReference = dependencyContext.CompileLibraries.FirstOrDefault(l => l.Name == "System.Runtime.CompilerServices.Unsafe", defaultValue: null);
120+
packageReference.Should().BeNull();
121+
}
122+
else
123+
{
124+
// Ensure some compile references exist
125+
var packageReference = dependencyContext.CompileLibraries.First(l => l.Name == "System.Runtime.CompilerServices.Unsafe");
126+
packageReference.Assemblies.Should().NotBeEmpty();
127+
}
119128

120129
var projectReference = dependencyContext.CompileLibraries.First(l => l.Name == TestProjectName);
121130
projectReference.Assemblies.Should().NotBeEmpty();

0 commit comments

Comments
 (0)