【发布时间】:2011-07-11 17:01:20
【问题描述】:
有没有一种方法(文本或图形)来查看 NuGet 包之间的依赖关系层次结构?
【问题讨论】:
有没有一种方法(文本或图形)来查看 NuGet 包之间的依赖关系层次结构?
【问题讨论】:
还可以针对NuGet.Core 中的API 编写代码。通过 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
【讨论】:
FindPackages时崩溃
由于这是一个老问题,请务必注意以下几点:
这是新 csproj 格式的内置功能。在 Visual Studio 2017 及更高版本中,打开解决方案资源管理器,您可以找到如下包:
{Your project}->Dependencies->Packages
您可以打开每个 NuGet 依赖关系树并使用它递归运行,不仅可以有效查看特定包的依赖关系树,还可以查看您的项目实际安装了哪些 NuGet 包。
【讨论】:
我添加了一个与最新版本的 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);
}
}
}
【讨论】:
类似于@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);
}
}
}
【讨论】:
您的另一个选择是使用nuget-deps-tree npm 包。 它支持 packages.config 格式和 .NET 项目使用的较新的 assets 格式。
【讨论】:
我找到了一个不错的NPM package 将依赖关系树打印到控制台。当然,如果你不介意使用/安装 NPM/Node.JS。
考虑其他解决方案,这是最简单的一种,您不需要编写自己的代码或注册某些东西,并且您会得到您所期望的依赖树。但它只适用于packages.config 格式。
我不敢相信免费的 Visual Studio 版本或 nuget.exe 也没有此功能。
【讨论】:
I Can Has .NET Core (GitHub repository) 生成漂亮的 NuGet 依赖关系图以及 Graphviz 表示。顾名思义,您还可以免费获得 .NET Core 兼容性信息。
如果您更喜欢在计算机上本地运行它,I Can Has .NET Core 还提供console 模式。
【讨论】:
https://github.com/mikehadlow/AsmSpy 使用它来识别项目中的程序集版本
【讨论】:
仅供参考,MyGet.org 内置了这种可视化。您可以在 Feed 详细信息页面上查看依赖关系图。
【讨论】:
从 NuGet 1.4 可视化的包应该可以工作。见http://docs.nuget.org/docs/release-notes/nuget-1.4
【讨论】: