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

How to read the list of NuGet packages in packages.config programatically?

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

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

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

谢谢

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

下面是一些示例代码,使用此 class 打印出包 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);
}

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

Install-Package NuGet.Core -ProjectName Project02

接下来,您需要在 whatever.cs 页面中添加一个 using 语句,您将要做的工作是针对该包,假设您只想获取版本号以便打印它在您网站的某个地方。这正是我想做的。

using NuGet;

接下来我想找到一个特定的包并读取它的版本号,这样当我们发布我的软件时,我在我网站的某个地方有一个视觉标识符,我可以去查看它的版本生产.

这是我为在我的页面上填充网络表单标签而编写的代码。

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();
    }

这个问题的答案略有不同,但这显示了我在找到这个 Question/Answer 并修改我学到的内容以满足我自己的需要后最终满足我的需要的解决方案。我希望它可以帮助其他人。