Existe-t-il un moyen, textuel ou graphique, de visualiser la hiérarchie des dépendances entre les packages nuget?
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);
}
}
}
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
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.
Le package visualisé à partir de NuGet 1.4 devrait fonctionner. Voir http://docs.nuget.org/docs/release-notes/nuget-1.4
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 .
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);
}
}
}
https://github.com/mikehadlow/AsmSpy en l'utilisant pour identifier la version de l'assembly dans un projet
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.
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.