View NuGet package dependency hierarchy

后端 未结 10 1290
遇见更好的自我
遇见更好的自我 2020-12-07 16:24

Is there a way, either textual or graphical, to view the hierarchy of dependencies between NuGet packages?

相关标签:
10条回答
  • 2020-12-07 16:48

    It is also possible to write code against the API in NuGet.Core. Install it via NuGet:

    install-package nuget.core
    

    Then you can get a repository object and walk the graph. Here's a sample app I just built:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using NuGet;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main()
            {    
                var repo = new LocalPackageRepository(@"C:\Code\Common\Group\Business-Logic\packages");
                IQueryable<IPackage> packages = repo.GetPackages();
                OutputGraph(repo, packages, 0);
            }
    
            static void OutputGraph(LocalPackageRepository repository, IEnumerable<IPackage> packages, int depth)
            {
                foreach (IPackage package in packages)
                {
                    Console.WriteLine("{0}{1} v{2}", new string(' ', depth), package.Id, package.Version);
    
                    IList<IPackage> dependentPackages = new List<IPackage>();
                    foreach (var dependency in package.Dependencies)
                    {
                        dependentPackages.Add(repository.FindPackage(dependency.Id, dependency.VersionSpec.ToString()));
                    }
    
                    OutputGraph(repository, dependentPackages, depth += 3);
                }
            }
        }
    }
    

    In my case, this app outputs something like this:

    MyCompany.Castle v1.1.0.3
       Castle.Windsor v2.5.3
          Castle.Core v2.5.2
          MyCompany.Common v1.1.0.6
             CommonServiceLocator v1.0
                MyCompany.Enum v1.1.0.7
       MyCompany.Common v1.1.0.6
          CommonServiceLocator v1.0
             MyCompany.Enum v1.1.0.7
          MyCompany.Enum v1.1.0.7
             MyCompany.Versioning v1.3
                Castle.Core v2.5.2
                   Castle.Windsor v2.5.3
                      Castle.Core v2.5.2
                      CommonServiceLocator v1.0
                         NUnit v2.5.10.11092
                            RhinoMocks v3.6
    
    0 讨论(0)
  • 2020-12-07 16:53

    If your using the new .csproj, you could get all dependencies with reference in here (after project buil):

    {ProjectDir}\obj\project.assets.json

    0 讨论(0)
  • 2020-12-07 16:54

    Since this is an old question, it is important to note the following:

    This is a built-in feature in the new csproj format. If using VS 2017, in

    Solution Explorer->{Your project}->Dependencies->NuGet
    

    you can open each NuGet dependency tree and run with it recursively, effectively seeing not only the dependency tree for specific packages, but also which NuGet packages your project actually installs.

    0 讨论(0)
  • 2020-12-07 16:55

    Package Visualized from NuGet 1.4 should work. See http://docs.nuget.org/docs/release-notes/nuget-1.4

    0 讨论(0)
  • 2020-12-07 16:59

    FYI, MyGet.org has this kind of visualization built-in. You can view dependency graphs on the Feed Details page.

    0 讨论(0)
  • 2020-12-07 17:06

    Like @neil-barnwell solution, but works with NuGet.Core 2.7+

    Install-Package NuGet.Core
    

    Here is the code

    using System;
    using System.Linq;
    using System.Runtime.Versioning;
    using System.IO;
    using NuGet;
    
    public class Program
    {
        public static void Main(string[] args)
        {
            var frameworkName = new FrameworkName(".NETFramework, Version=4.0");
    
            // var packageSource = "https://www.nuget.org/api/v2/";
            var packageSource = Path.Combine(Environment.GetEnvironmentVariable("LocalAppData"), "NuGet", "Cache");
    
            var repository = PackageRepositoryFactory.Default.CreateRepository(packageSource);
            const bool prerelease = false;
    
            var packages = repository.GetPackages()
                .Where(p => prerelease ? p.IsAbsoluteLatestVersion : p.IsLatestVersion)
                .Where(p => VersionUtility.IsCompatible(frameworkName, p.GetSupportedFrameworks()));
    
            foreach (IPackage package in packages)
            {
                GetValue(repository, frameworkName, package, prerelease, 0);
            }
    
            Console.WriteLine();
            Console.WriteLine("Press Enter...");
            Console.ReadLine();
        }
    
        private static void GetValue(IPackageRepository repository, FrameworkName frameworkName, IPackage package, bool prerelease, int level)
        {
    
            Console.WriteLine("{0}{1}", new string(' ', level * 3), package);
            foreach (PackageDependency dependency in package.GetCompatiblePackageDependencies(frameworkName))
            {
                IPackage subPackage = repository.ResolveDependency(dependency, prerelease, true);
                GetValue(repository, frameworkName, subPackage, prerelease, level + 1);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题