如何通过程序读取packages.config中NuGet包的列表?

7

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

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

我可以看到有一个NuGet.Core软件包可用 - 我如何使用它来实现我的目标?

谢谢


这是XML格式,所以XMLReader应该能胜任此工作。 - Callum Bradbury
它们只是XML文件。您可以使用System.Xml命名空间轻松地阅读和解释它们。 - Brendan Green
NuGet是开源的,为什么不重用它的代码呢? - Lex Li
是的,我可以直接读取它们作为原始XML - 但如果NuGet API可用,我的首选是使用它,以免重复造轮子。如果NuGet发布的包中没有可用的内容,我的下一步是查看NuGet源代码。 - Gary Howlett
2个回答

16

如果您不想直接阅读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.Packaging NuGet包,并使用类似以下代码:

var document = XDocument.Load (fileName);
var reader = new PackagesConfigReader (document);
foreach (PackageReference package in reader.GetPackages ())
{
    Console.WriteLine (package.PackageIdentity);
}

1
有没有想过现代NuGet API版本的等效物是什么? - Alastair Maw
2
@AlastairMaw - 已更新答案,采用了更为现代的方法。 - Matt Ward

0

如建议所述,您需要安装NuGet.Core,您的解决方案中可能有几个项目,因此在安装时知道如何指定项目名称是很好的。假设您的解决方案是MySolution,您有两个项目Project01Project02,并且您只想在Project02中安装。

Install-Package NuGet.Core -ProjectName Project02

接下来,您需要在要进行工作的whatever.cs页面中添加一个使用语句来定位包,假设您只想获取版本号,以便可以在网站上某个地方打印出来。这实际上就是我想做的事情。

using NuGet;

接下来,我想获取特定软件包并读取其版本号,以便在发布我的软件时,在我的网站上的某个特定位置有一个可视化标识符,我可以去查看正在生产中的版本。

以下是我编写的代码,用于填充我的页面上的WebForms标签。

protected void Page_Load(Object sender, EventArgs e)
    {
        var pkgRefpath = Server.MapPath("~/packages.config");

        PackageReferenceFile nugetPkgConfig = new PackageReferenceFile(pkgRefpath);
        IEnumerable<PackageReference> 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();
    }

这是一个稍微不同的答案,但这展示了我在找到这个问题/答案并修改我所学内容以适应自己需求后得出的解决方案。我希望它能帮助其他人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接