如何以编程方式读取packages.config中的NuGet包列表?

读取(最好是通过C#)packages.config文件中列出的软件包的最佳方法是什么?

在我们的源代码库中,我有很多解决方案和项目,同样还有很多packages.config文件。 我正在尝试在我的源代码存储库中构建一个正在使用的包(和版本)的整合列表。

我可以看到有一个NuGet.Core包可用 – 我怎么能用它来实现我的目标?

谢谢

如果您不想直接读取XML,可以安装NuGet.Core NuGet包,然后使用PackageReference类。

下面是一些使用此类打印包ID及其版本的示例代码。

 string fileName = @"c:\full\path\to\packages.config"; var file = new PackageReferenceFile(fileName); foreach (PackageReference packageReference in file.GetPackageReferences()) { Console.WriteLine("Id={0}, Version={1}", packageReference.Id, packageReference.Version); } 

你需要自己找到packages.config文件,你可以用目录搜索来完成,例如:

 foreach (string fileName in Directory.EnumerateFiles("d:\root\path", "packages.config", SearchOption.AllDirectories)) { // Read the packages.config file... } 

根据建议您需要安装NuGet.Core,您的解决方案可能包含多个项目,因此最好知道在安装时如何指定项目名称。 假设你的解决方案是MySolution,你有两个项目Project01Project02 ,你只想在Project02中安装。

Install-Package NuGet.Core -ProjectName Project02

接下来,您将需要在whatever.cs页面中添加一个using语句,用于定位程序包,并假设您只想获取版本号,以便可以在网站的某个位置打印出来。 这实际上就是我想要做的。

using NuGet;

接下来我想得到一个特定的包并阅读它的版本号,这样当我们发布我的软件时,我在我的网站上的某个地方有一个可视标识符,我可以去看看正在制作的版本。

这是我编写的代码,用于填充页面上的webforms标签。

 protected void Page_Load(Object sender, EventArgs e) { var pkgRefpath = Server.MapPath("~/packages.config"); PackageReferenceFile nugetPkgConfig = new PackageReferenceFile(pkgRefpath); IEnumerable allPackages = nugetPkgConfig.GetPackageReferences(); var newtonsoftPkg = ( from pkg in allPackages where pkg.Id == "Newtonsoft.Json" select pkg ).FirstOrDefault(); if (newtonsoftPkg== null) return; var newtonsoftPkg_Version = newtonsoftPkg.Version; ltrNewtonsoftVer.Text = newtonsoftPkg_Version.ToString(); } 

对于这个问题,这是一个稍微不同的答案,但是这显示了我在找到这个问题/答案并修改我学到的东西以满足我自己的需求后最终满足我的需求的解决方案。 我希望它可以帮助其他人。