如何以编程方式获取解决方案中使用的 NuGet 包的版本?
Posted
技术标签:
【中文标题】如何以编程方式获取解决方案中使用的 NuGet 包的版本?【英文标题】:How can I programatically get the version of a NuGet package being used in the solution? 【发布时间】:2016-04-18 23:02:19 【问题描述】:我正在做一个项目,我们需要知道我们正在使用的 NuGet 包的版本,并在代码中使用它。
我尝试的一种方法是从packages.config
文件中读取,将其解析为我想要的包,然后解析版本的行。比如:
var lines = System.IO.File.ReadAllLines(@"..\..\packages.config");
foreach(var line in lines)
if (line.Contains("My.Package"))
foreach(var part in line.split(' '))
if (part.Contains("version"))
return part.Split('"')[1];
有没有更好的方式以编程方式做到这一点?
注意:上述代码将不起作用,因为 packages.config 没有与应用程序一起部署。
【问题讨论】:
将其作为 XML 阅读可能更有意义。什么时候需要知道包的版本?您也可以从已编译的程序集版本中确定它。 不确定您所说的“在哪个时间点”到底是什么意思,但我想在运行时获取版本,以便在代码的其他地方使用。 部署应用时是否包含packages.config
?
@AleksandrIvanov 不,我们没有,所以很遗憾,这行不通。
相关:How can I get the NuGet package version programmatically from a NuGet feed?
【参考方案1】:
好问题。但是你还没有说你为什么要知道版本。
我必须从指出你走错路开始我的回答。我怀疑您需要在运行时知道正在使用的程序集版本。
但整个 NuGet 概念和packages.config
是编译时概念而不是运行时概念。你甚至不应该在你的输出文件夹或发布文件夹中有packages.config
。在运行时,您需要从AppDomain.CurrentDomain
获取加载的程序集。我不会在这里深入讨论,而是here is the reference you can look at。我只是说你可以在那里得到汇编版本。
然后,在代码中,如果您想根据特定的程序集版本做不同的事情。如果您想根据框架或程序集的版本进行编译 - check this post
底线:
packages.config 存在与否,或者其中有什么,与在编译时使用了哪个 DLL 文件无关。 VS 具有令人难以置信的爬取目录和查找匹配的 DLL 文件的能力。 packages.config 可能已过时或与实际 dll 不同步。这不是万无一失的做事方式。
【讨论】:
原因并不重要。这是其他人在互联网上搜索的具体问题,直接回答是最有帮助的。 @WarrenParks 理由(或者,在编程中我们称之为动机)非常重要;因为大多数时候这里发布的问题都有一个简单的解决方案。只有人从一开始就走错了方向。让我告诉你一些关于这个问题的事情 - packages.config 存在与否这一事实与编译时使用的 which dll 无关。 packages.config 可能已过时或与实际 dll 不同步。这不是万无一失的做事方式,因此我的回答。如果你有不同的感觉,我很好。享受吧。 再次,无法保证运行时使用的程序集与编译时使用的版本相同。这就是为什么反射需要获得汇编版本的原因。你如何得到它 - 是一个不同的问题。【参考方案2】:您可以从程序集中读取版本:
string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString();
【讨论】:
【参考方案3】:如果包有任何类,您可以从该类获取程序集,然后获取版本。但是,如果包没有类,例如使用 nuget.targets 复制文件之类的操作是不可能的。
Console.WriteLine("Using Selenium.WebDriver: " + Assembly.GetAssembly(typeof(OpenQA.Selenium.By)).GetName().Version.ToString());
【讨论】:
注意:这只获取主要版本。例如 Serilog 2.4.0 -> 2.0.0.0以上是关于如何以编程方式获取解决方案中使用的 NuGet 包的版本?的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 如何以编程方式检索具有相同所有者的所有 nuget 包元数据?
如何通过 NuGet 包共享源代码以用于 .NET Core 项目
Azure Pipeline Nuget 包版本控制方案,如何获取“1.0.$(Rev:r)”