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

时间:2015-10-09 10:18:49

标签: c# nuget

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

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

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

由于

2 个答案:

答案 0 :(得分:10)

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

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

HANDLE WriteCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);

SetEvent(WriteCompleted);
WaitForSingleObject(pThis->WriteCompleted, INFINITE);
CloseHandle(WriteCompleted);

您需要自己找到packages.config文件,您可以使用目录搜索来执行这些操作,例如:

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

另一种更新的方法是安装NuGet.Packaging NuGet包并使用类似的代码:

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

答案 1 :(得分:0)

根据建议您需要安装NuGet.Core,您的解决方案可能包含多个项目,因此最好知道如何在安装时指定项目名称。假设你的解决方案是MySolution,你有两个项目 Project01 & Project02 ,您只想安装在 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<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();
    }

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