什么是最佳方法(最好使用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.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 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();
}
这是一个稍微不同的答案,但这展示了我在找到这个问题/答案并修改我所学内容以适应自己需求后得出的解决方案。我希望它能帮助其他人。
System.Xml
命名空间轻松地阅读和解释它们。 - Brendan Green