查看nuget包依赖层次结构

时间:2011-07-11 17:01:21

标签: c# nuget

有没有办法(文本或图形)来查看nuget包之间依赖关系的层次结构?

11 个答案:

答案 0 :(得分:22)

喜欢@ neil-barnwell解决方案,但可以使用NuGet.Core 2.7 +

Install-Package NuGet.Core

这是代码

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);
        }
    }
}

答案 1 :(得分:16)

也可以在NuGet.Core中针对API编写代码。通过nuget安装它:

install-package nuget.core

然后,您可以获取存储库对象并遍历图形。这是我刚刚构建的示例应用程序:

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);
            }
        }
    }
}

在我的情况下,这个应用程序输出如下内容:

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

答案 2 :(得分:9)

我找到了一个很好的NPM package来将依赖树打印到控制台中。当然,如果您不介意使用/安装NPM / Node.JS。

考虑到其他解决方案,这是最简单的解决方案,您不需要编写自己的代码或注册某些内容,并且您可以获得所期望的依赖树。但它仅适用于packages.config格式。

我无法相信这个功能在免费的Visual Studio版本或nuget.exe中也不存在。

答案 3 :(得分:7)

从NuGet 1.4可视化的包应该可以工作。见http://docs.nuget.org/docs/release-notes/nuget-1.4

答案 4 :(得分:5)

I Can Has .NET CoreGitHub repository)生成漂亮的NuGet依赖关系图以及Graphviz表示形式。顾名思义,您还可以免费获得.NET Core兼容性信息。

如果您希望在计算机上本地运行它,我可以拥有.NET Core 还提供了console模式。

NuGet dependencies graph sample (web)

NuGet dependencies graph sample (Graphviz)

答案 5 :(得分:5)

您的另一个选择是使用 nuget-deps-tree npm 包。 它支持 packages.config 格式和 .NET 项目使用的较新的 assets 格式。

答案 6 :(得分:3)

我使用最新版本的nuget-core

添加兼容的解决方案
install-package nuget.core

这是获取依赖关系图的控制台App

    class Program
    {
        static void Main()
        {
            Console.Write("Enter the local repo folder: ");
            var repoFolder = Console.ReadLine();

            var repo = new LocalPackageRepository(repoFolder);
            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 dependencySet in package.DependencySets)
                {
                    foreach (var dependency in dependencySet.Dependencies)
                    {
                        var dependentPackage = repository.FindPackage(dependency.Id, dependency.VersionSpec, true, true);
                        if (dependentPackage != null)
                        {
                            dependentPackages.Add(dependentPackage);
                        }
                    }       
                }

                OutputGraph(repository, dependentPackages, depth += 3);
            }
        }
    }

答案 7 :(得分:2)

仅供参考,MyGet.org内置了这种可视化功能。您可以在Feed Details页面上查看依赖关系图。

答案 8 :(得分:2)

https://github.com/mikehadlow/AsmSpy使用它来识别项目中的程序集版本

答案 9 :(得分:1)

由于这是一个古老的问题,因此请注意以下几点:

这是csproj格式的内置功能。如果使用VS 2017,请在

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

您可以打开每个NuGet依赖关系树并以递归方式运行它,不仅可以查看特定程序包的依赖关系树,还可以查看您的项目实际安装的NuGet程序包。

答案 10 :(得分:0)

如果您使用新的.csproj,则可以在此处(在项目建立之后)获得所有引用的引用:

{ProjectDir} \ obj \ project.assets.json

enter image description here