![](/img/trans.png)
[英]How can I get the NuGet package version programmatically from a NuGet feed?
[英]How can I programatically get the version of a NuGet package being used in the solution?
我正在做一个项目,我们需要知道我们正在使用的一个 NuGet package 的版本,并在代码中使用它。
我尝试的一种方法是从packages.config
文件中读取,将其解析为我想要的 package,然后解析版本行。 就像是:
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没有随应用程序一起部署。
如果包有任何类,您可以从该类获取程序集,然后获取版本。 但是,如果包没有类,例如使用 nuget.targets 复制文件,那么这种方式是不可能的。
Console.WriteLine("Using Selenium.WebDriver: " + Assembly.GetAssembly(typeof(OpenQA.Selenium.By)).GetName().Version.ToString());
好问题。 但是你还没有说你为什么想知道版本。
我必须从指出你走错路开始我的回答。 我怀疑您需要在运行时知道正在使用的程序集版本。
但是整个 NuGet 概念和packages.config
是一个编译时概念而不是运行时概念。 您甚至不应该在输出文件夹或已发布文件夹中包含packages.config
。 在运行时,您需要从AppDomain.CurrentDomain
获取加载的程序集。 我不会在这里深入讨论它,但这里是您可以查看的参考。 我只说你可以在那里获得汇编版本。
然后,在代码中,如果您想根据某些程序集版本做不同的事情。 如果您想根据框架或程序集的版本进行编译 - 请查看这篇文章
底线:
packages.config 存在与否,或其中包含什么,与编译时使用了哪个 DLL 文件无关。 VS 具有令人难以置信的能力,可以在目录中爬行并找到匹配的 DLL 文件。 packages.config可能已过时或与实际 dll 不同步。 这不是一种万无一失的做事方式。
您可以从程序集中读取版本:
string assemblyVersion = Assembly.LoadFile('your assembly file').GetName().Version.ToString();
您可以将项目配置为在编译时记录数据。 下面是一个 MSBuild 片段,它生成一个名为MyNamespace.MSBuildVersionAttribute
的程序集属性,带有一个构造函数参数。
<Target Name="ExtractMSBuildVersion" BeforeTargets="BeforeBuild">
<ItemGroup>
<MSBuildPackageVersion Include="@(PackageReference->'%(Version)')" Condition="'%(Identity)' == 'Microsoft.Build'" />
<AssemblyAttributes Include="MyNamespace.MSBuildVersionAttribute">
<_Parameter1>@(MSBuildPackageVersion)</_Parameter1>
</AssemblyAttributes>
</ItemGroup>
<WriteCodeFragment AssemblyAttributes="@(AssemblyAttributes)" Language="C#" OutputDirectory="$(IntermediateOutputPath)" OutputFile="MSBuildVersion.cs">
<Output TaskParameter="OutputFile" ItemName="Compile" />
<Output TaskParameter="OutputFile" ItemName="FileWrites" />
</WriteCodeFragment>
</Target>
您现在可以在运行时访问该属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.