in src/Tasks/Microsoft.NET.Build.Tasks/ProjectContext.cs [187:252]
public HashSet<string> GetExcludeFromPublishList(
IEnumerable<string> excludeFromPublishPackageIds,
IDictionary<string, LockFileTargetLibrary> libraryLookup)
{
var nonExcludeFromPublishAssets = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var nonExcludeFromPublishAssetsToSearch = new Stack<string>();
var excludeFromPublishAssetsToSearch = new Stack<string>();
// Start with the top-level dependencies, and put them into "private" or "non-private" buckets
var excludeFromPublishPackagesLookup = new HashSet<string>(excludeFromPublishPackageIds, StringComparer.OrdinalIgnoreCase);
foreach (var topLevelDependency in GetTopLevelDependencies())
{
if (!excludeFromPublishPackagesLookup.Contains(topLevelDependency))
{
nonExcludeFromPublishAssetsToSearch.Push(topLevelDependency);
nonExcludeFromPublishAssets.Add(topLevelDependency);
}
else
{
excludeFromPublishAssetsToSearch.Push(topLevelDependency);
}
}
LockFileTargetLibrary library;
string libraryName;
// Walk all the non-private assets' dependencies and mark them as non-private
while (nonExcludeFromPublishAssetsToSearch.Count > 0)
{
libraryName = nonExcludeFromPublishAssetsToSearch.Pop();
if (libraryLookup.TryGetValue(libraryName, out library))
{
foreach (var dependency in library.Dependencies)
{
if (!nonExcludeFromPublishAssets.Contains(dependency.Id))
{
nonExcludeFromPublishAssetsToSearch.Push(dependency.Id);
nonExcludeFromPublishAssets.Add(dependency.Id);
}
}
}
}
// Go through assets marked private and their dependencies
// For libraries not marked as non-private, mark them down as private
var assetsToExcludeFromPublish = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
while (excludeFromPublishAssetsToSearch.Count > 0)
{
libraryName = excludeFromPublishAssetsToSearch.Pop();
if (libraryLookup.TryGetValue(libraryName, out library))
{
assetsToExcludeFromPublish.Add(libraryName);
foreach (var dependency in library.Dependencies)
{
if (!nonExcludeFromPublishAssets.Contains(dependency.Id))
{
excludeFromPublishAssetsToSearch.Push(dependency.Id);
}
}
}
}
return assetsToExcludeFromPublish;
}