查看nuget包依赖层次结构

Nei*_*ell 57 c# nuget

有没有办法,无论是文本还是图形,来查看nuget包之间依赖关系的层次结构?

Gia*_*rdi 25

像@ neil-barnwell解决方案,但与NuGet.Core 2.7+一起使用

Install-Package NuGet.Core
Run Code Online (Sandbox Code Playgroud)

这是代码

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Nei*_*ell 19

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

install-package nuget.core
Run Code Online (Sandbox Code Playgroud)

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

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • 深度+ = 3可能是一个错误,更改为深度+ 3.然后您可以看到左侧的所有包,只有该包的依赖关系缩进 (5认同)
  • 我尝试将此更新到最新版本的NuGet,但我的编辑被拒绝了.将foreach依赖项更改为package.DependencySets并添加另一个foreach循环获取依赖项. (3认同)
  • 您可以使用NuGet中的ResolveDependency扩展方法。 (2认同)

Joh*_*n_J 17

如果您使用 new .csproj,您可以在此处获取所有引用的依赖项(在项目构建后):

{ProjectDir}\obj\project.assets.json

在此处输入图片说明

  • 我认为这适用于任何使用`&lt;PackageReference&gt;`格式而不是packages.config文件的csproj。我有一个带有旧式 csproj 的遗留应用程序,修改为使用 PackageReference 并且此文件存在于我的 obj 文件夹中。 (7认同)

N. *_*sev 11

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

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

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

  • 这很好用(对于packages.config格式),应该有更多的投票!请注意,为依赖项显示的版本号不是所需的最低版本(或范围),而是安装的实际版本.(知道哪些软件包依赖于非常旧版本的依赖项会很好,因为当前安装的版本可能会有重大更改.) (3认同)

Eug*_*nko 7

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

  • 啊,这是有帮助的,但不幸的是我只有VS Pro,而用于此的工具只在Ultimate中.:( (4认同)

小智 7

我添加了与最新版本的 nuget-core 兼容的解决方案

install-package nuget.core
Run Code Online (Sandbox Code Playgroud)

这是获取依赖关系图的控制台应用程序

    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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


0xc*_*ced 7

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

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

NuGet依赖关系图示例(Web)

NuGet依赖关系图示例(Graphviz)

  • *“我们决定于 2020 年 5 月关闭 https://icanhasdot.net/。”* — [GitHub - OctopusDeploy/ICanHasDotnetCore](https://github.com/OctopusDeploy/ICanHasDotnetCore) (2认同)

Jos*_*man 6

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

这是新的 csproj 格式的内置功能。在 Visual Studio 2017 及更高版本中,打开解决方案资源管理器,您可以找到如下包:

{Your project}->Dependencies->Packages
Run Code Online (Sandbox Code Playgroud)

您可以打开每个 NuGet 依赖树并递归运行它,不仅可以有效地查看特定包的依赖树,还可以查看您的项目实际安装了哪些 NuGet 包。

  • 您究竟在哪里看到“依赖关系”?我在解决方案资源管理器中的任何地方都没有看到它。 (2认同)
  • 如果您正在处理 .Net Standard 或 .Net Core 项目,则可以通过打开每个项目的树来查看它。但是,如果您正在处理 .Net Framework 项目,那么您应该使用其他响应之一。 (2认同)
  • 有人知道这是否会进入我们这些使用 .Net Frameweork 的人的解决方案资源管理器中吗? (2认同)

Eya*_*she 5

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