web-dev-qa-db-fra.com

Afficher la hiérarchie des dépendances des packages nuget

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

60
Neil Barnwell

Comme la solution @ neil-barnwell, mais 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);
        }
    }
}
24

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

install-package nuget.core

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

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 génère 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
17
Neil Barnwell

J'ai trouvé un Nice package NPM pour imprimer l'arborescence des dépendances dans la console. Bien sûr, si cela ne vous dérange pas d'utiliser/d'installer NPM/Node.JS.

En considérant d'autres solutions, c'est la plus simple, vous n'avez pas besoin d'écrire votre propre code ou d'enregistrer quelque chose, et vous obtenez exactement l'arbre de dépendance que vous attendez. Mais cela ne fonctionne qu'avec packages.config format.

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

11
N. Kudryavtsev

Le package visualisé à partir de NuGet 1.4 devrait fonctionner. Voir http://docs.nuget.org/docs/release-notes/nuget-1.4

7
Eugene Petrenko

I Can Has .NET Core ( GitHub repository ) produit de jolis graphiques des dépendances NuGet avec une représentation Graphviz . Et comme son nom l'indique, vous obtenez également gratuitement des informations sur la compatibilité .NET Core.

Si vous préférez l'exécuter localement sur votre ordinateur, I Can Has .NET Core propose également un mode console .

NuGet dependencies graph sample (web)

NuGet dependencies graph sample (Graphviz)

6
0xced

J'ajoute une solution compatible avec la dernière version de nuget-core

install-package nuget.core

Ceci est l'application console pour obtenir le graphique des dépendances

    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);
            }
        }
    }
4
Javier Solis

https://github.com/mikehadlow/AsmSpy en l'utilisant pour identifier la version de l'assembly dans un projet

2
Martea

Pour info, MyGet.org a ce type de visualisation intégré. Vous pouvez afficher des graphiques de dépendance sur la page Détails du flux.

2
Xavier Decoster

Puisqu'il s'agit d'une vieille question, il est important de noter ce qui suit:

Il s'agit d'une fonctionnalité intégrée au nouveau format csproj. Si vous utilisez VS 2017, dans

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

vous pouvez ouvrir chaque arborescence de dépendances NuGet et l'exécuter de manière récursive, en voyant non seulement l'arborescence de dépendances pour des packages spécifiques, mais également les packages NuGet que votre projet installe réellement.

1
Josef Ginerman