74 votes

Afficher la hiérarchie des dépendances des paquets NuGet

Existe-t-il un moyen, textuel ou graphique, de visualiser la hiérarchie des dépendances entre les paquets NuGet ?

31voto

Comme la solution de @neil-barnwell, mais elle fonctionne avec NuGet.Core 2.7+.

Install-Package NuGet.Core

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

23voto

Neil Barnwell Points 20731

Il est également possible d'écrire du code contre l'API en NuGet.Core . Installez-le via NuGet :

install-package nuget.core

Ensuite, vous pouvez obtenir un objet de référentiel et parcourir le graphe. Voici un exemple d'application que je viens de construire :

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

Dans mon cas, cette application produit quelque chose comme ceci :

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

17voto

N. Kudryavtsev Points 811

J'ai trouvé une belle Paquet NPM pour imprimer l'arbre de dépendance dans la console. Bien sûr, si cela ne vous dérange pas d'utiliser/installer NPM/Node.JS.

Si l'on considère les autres solutions, celle-ci est la plus simple, vous n'avez pas besoin d'écrire votre propre code ou d'enregistrer quelque chose, et vous obtenez l'arbre de dépendances que vous attendez. Mais elle ne fonctionne qu'avec packages.config formato.

Je ne peux pas croire que cette fonctionnalité soit absente des éditions gratuites de Visual Studio ou de nuget.exe également.

12voto

John_J Points 392

Si vous utilisez le nouveau .csproj vous pouvez obtenir toutes les dépendances avec la référence ici (après la construction du projet) :

{Dossier du projet} \obj\project.assets.json

enter image description here

11voto

0xced Points 10972

Je peux avoir .NET Core ( Dépôt GitHub ) produit de jolis graphiques des dépendances NuGet ainsi qu'un fichier Graphviz représentation. Et comme son nom l'indique, vous obtenez aussi gratuitement des informations sur la compatibilité avec .NET Core.

Si vous préférez l'exécuter localement sur votre ordinateur, Je peux avoir .NET Core propose également un console mode.

NuGet dependencies graph sample (web)

NuGet dependencies graph sample (Graphviz)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X