.NET Core Dependency Tree

You can actually search through dependencies of particular project quite easily in Visual Studio.

Just right click on Dependencies, select "scope to this". And then you can directly search through dependencies. scope to this


This flashed up today in the Morning Brew which might be worth a look:

Martin Bjorkstrom Dotnet Depends


You can add an msbuild target to your project file (inside the <Project> element) like this:

<Target Name="PrintAllReferences" DependsOnTargets="RunResolvePackageDependencies">
  <Message Importance="high" Text="Referenced package: %(PackageDefinitions.Identity)" />
</Target>

Which you can call like this (a line without a parent package name means it is referenced by the project directly):

$ dotnet msbuild /nologo /t:PrintAllReferences
  Referenced package: Microsoft.NETCore.Platforms/1.1.0
  Referenced package: Microsoft.NETCore.Targets/1.1.0
  Referenced package: Microsoft.Win32.Primitives/4.3.0
  Referenced package: NETStandard.Library/1.6.1
  Referenced package: runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.native.System/4.3.0
  Referenced package: runtime.native.System.IO.Compression/4.3.0
  Referenced package: runtime.native.System.Net.Http/4.3.0
  Referenced package: runtime.native.System.Security.Cryptography.Apple/4.3.0
  Referenced package: runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0
  Referenced package: System.Buffers/4.3.0
  Referenced package: System.Collections/4.3.0
  …

If you wanted a "reverse dependency tree" - a list of packages and which packages reference them - you can do something similar to:

<Target Name="PrintPackagesAndParents" DependsOnTargets="RunResolvePackageDependencies">
  <Message Importance="high" Text="* %(PackageDependencies.Identity) referenced by:%0a^---@(PackageDependencies->'%(ParentPackage) - target %(ParentTarget)', '%0a^---')" />
</Target>

which produces the following output:

$ dotnet msbuild /nologo /t:PrintPackagesAndParents
  * JetBrains.Annotations/10.2.1 referenced by:
  ^--- - target .NETStandard,Version=v1.3
  * System.IO.FileSystem.Primitives/4.0.1 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.IO.Compression.ZipFile/4.0.1 - target .NETStandard,Version=v1.3
  ^---System.IO.FileSystem/4.0.1 - target .NETStandard,Version=v1.3
  ^---System.Xml.ReaderWriter/4.0.11 - target .NETStandard,Version=v1.3
  * System.Linq/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.Security.Cryptography.Encoding/4.0.0 - target .NETStandard,Version=v1.3
  * System.Linq.Expressions/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  * System.Net.Http/4.1.0 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  * System.Net.Primitives/4.0.11 referenced by:
  ^---NETStandard.Library/1.6.0 - target .NETStandard,Version=v1.3
  ^---System.Net.Http/4.1.0 - target .NETStandard,Version=v1.3
  ^---System.Net.Sockets/4.1.0 - target .NETStandard,Version=v1.3
  …

There isn't really documentation about these items, but they have "public" name and are generated by the ResolvePackageDependencies task which is executed as part of the RunResolvePackageDependencies target and produces a few very useful items: TargetDefinitions, PackageDefinitions, PackageDependencies, FileDependencies and DiagnosticMessages.