Skip to content

Commit 2c86f58

Browse files
committed
Exclude private assets
1 parent bf659ac commit 2c86f58

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

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

Lines changed: 39 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,38 @@ 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+
if (!includedDependencies.ContainsKey(dependencyName) && _excludeFromPublishPackageIds?.Contains(dependencyName) != true)
833+
{
834+
// There may not be a library in the assets file if a referenced project has
835+
// PrivateAssets="all" for a package reference, and there is a package in the graph
836+
// that depends on the same package.
837+
if (_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+
848+
foreach (var dependencyLibrary in _dependencyLibraries.Values)
849+
{
850+
if (!includedDependencies.ContainsKey(dependencyLibrary.Name))
851+
{
852+
dependencyLibrary.ExcludeFromCompilation = true;
853+
dependencyLibrary.ExcludeFromRuntime = true;
854+
}
855+
}
817856
}
818857

819858
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)"

0 commit comments

Comments
 (0)