Подтвердить что ты не робот

Просмотр иерархии зависимостей пакета nuget

Есть ли способ, текстовый или графический, для просмотра иерархии зависимостей между пакетами nuget?

4b9b3361

Ответ 1

Как и решение @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);
        }
    }
}

Ответ 2

Также можно написать код для API в NuGet.Core. Установите его через 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

Ответ 4

Я нашел хороший пакет NPM для печати дерева зависимостей в консоли. Конечно, если вы не против использования/установки NPM/Node.JS.

Учитывая другие решения, это самый простой, вам не нужно писать свой собственный код или регистрировать что-то, и вы получаете именно такое дерево зависимостей, как вы ожидаете. Но он работает только с форматом packages.config.

Я не могу поверить, что эта функциональность отсутствует в бесплатных версиях Visual Studio или nuget.exe.

Ответ 5

FYI, MyGet.org имеет встроенный вид визуализации. Вы можете просмотреть графики зависимостей на странице "Сведения о фиде".

Ответ 7

Я могу иметь.NET Core (репозиторий GitHub), создавая хорошие графики зависимостей NuGet вместе с представлением Graphviz. И, как следует из его названия, вы также получаете бесплатную информацию о совместимости.NET Core.

Если вы предпочитаете запускать его локально на своем компьютере, я могу иметь.NET Core также предлагать консольный режим.

NuGet dependencies graph sample (web)

NuGet dependencies graph sample (Graphviz)

Ответ 8

Я добавляю совместимое решение с последней версией nuget-core

install-package nuget.core

Это консольное приложение для получения графика зависимостей

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

Ответ 9

Поскольку это старый вопрос, важно отметить следующее:

Это встроенная функция в новом формате csproj. При использовании VS 2017 в

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

вы можете открыть каждое дерево зависимостей NuGet и работать с ним рекурсивно, эффективно видя не только дерево зависимостей для определенных пакетов, но также и то, что пакеты NuGet на самом деле устанавливают ваш проект.

Ответ 10

Недавно я нашел автономное консольное приложение PackageDump, которое сделает это довольно красиво - я подключился к TeamCity. Я начал с бесплатной версии, но только отображаемый вывод консоли, аналогичный тому, что показано выше, я бы порекомендовал про версию!