Просмотр иерархии зависимостей пакета nuget - PullRequest
51 голосов
/ 11 июля 2011

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

Ответы [ 9 ]

23 голосов
/ 03 октября 2013

Как и решение @ 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);
        }
    }
}
17 голосов
/ 19 июля 2011

Также возможно написать код для 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
9 голосов
/ 15 декабря 2017

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

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

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

7 голосов
/ 11 июля 2011

Пакет, визуализированный из NuGet 1.4, должен работать. Смотри http://docs.nuget.org/docs/release-notes/nuget-1.4

5 голосов
/ 03 декабря 2018

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

Если вы предпочитаете запускать его локально на вашем компьютере, I Can Has .NET Core также предлагает режим console .

NuGet dependencies graph sample (web)

NuGet dependencies graph sample (Graphviz)

4 голосов
/ 27 октября 2017

Я добавляю совместимое решение с последней версией 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);
            }
        }
    }
2 голосов
/ 11 января 2017

https://github.com/mikehadlow/AsmSpy, используя это для определения версии сборки в проекте

2 голосов
/ 12 января 2012

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

1 голос
/ 03 декабря 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...