jul*_*gon 6 nuget nuget-package nuget-spec
我需要nuget pack生成一个只有3位数的包版本(我们希望对它进行语义版本控制)但是当我在一个AssemblyVersion属性设置为"1.0.0" 的csproj上调用它时,生成的nupkg文件以版本"1.0结束.0.0"在它的元数据(和文件名)中.为什么命令行工具不支持AssemblyVersion属性上指定的位数?
我通过调用nuget speccsproj文件启动了这个,它生成了一个这样的stub nuspec文件(它实际上包含了带有占位符值的更多标签,但我删除了它们,因为我们不需要它们):
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>Release notes.</releaseNotes>
<copyright>Copyright 2015</copyright>
</metadata>
</package>
Run Code Online (Sandbox Code Playgroud)
将此nuspec文件在TFS中与csproj文件放在同一文件夹中,我们现在可以像这样调用pack:
nuget pack MyProject.csproj
Run Code Online (Sandbox Code Playgroud)
项目的AssemblyInfo.cs文件包含一行显式设置版本:
[assembly: AssemblyVersion("1.0.0")]
Run Code Online (Sandbox Code Playgroud)
除了工具在检索装配版本时使用4位数这一事实外,它完全正常工作.当我右键单击文件浏览器上的dll并转到详细信息时,甚至Windows显示只有3位数的版本.为什么NuGet使用4位数字?我也许错过了一些明显的东西?
对nuspec中的版本进行硬编码显然不是理想的,因为那时我们必须将版本号保持在两个不同的位置,而它们的目的始终是相同的.我的意思是,这应该$version$是NuGet本身知道如何从项目中提取的特殊占位符值背后的想法.
在创建和发布包中,声明NuGet在使用AssemblyVersionAttribute令牌时使用属性$version$.
深入研究NuGet源代码,我发现它并不像人们想象的那样直截了当.
NuGet使用反射来获取您的库的版本.AssemblyName.Version确切地说.由于版本的所有组件必须是大于或等于零的整数(请参阅AssemblyName.Version),因此显示的版本为1.0.0.0(在您的情况下),而不是AssemblyVersion属性中声明的1.0.0 .
可能的解决方法
的Nuspec参考页中添加旁边的更多信息$version$令牌.它提到AssemblyInformationalVersionAttribute属性将优先于AssemblyVersionAttribute.使用它将解决您的问题.
深入挖掘
您可能想知道为什么会AssemblyInformationalVersionAttribute起作用而不会起作用AssemblyVersionAttribute?
这个问题的答案是NuGet CustomAttributeData.GetCustomAttributes(Assembly)
在使用Assembly.Version之前使用函数来检索库的属性.上面的函数不会列出AssemblyVersionAttribute,但它会列出AssemblyInformationalVersionAttribute它是否在程序集中使用.只有这样,如果找不到AssemblyInformationalVersionAttribute,将使用Assembly.Version.
编辑:
相关NuGet源代码:
NuGet使用以下代码获取程序集版本(如果未找到AssemblyInformationalVersionAttribute):
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(path);
AssemblyName assemblyName = assembly.GetName();
...
version = new SemanticVersion(assemblyName.Version);
Run Code Online (Sandbox Code Playgroud)
问题始于assembly.GetName(),因为它创建并使用相关参数(包括版本)初始化AssemblyName.
(该代码可以在AssemblyMetadataExtractor类中的public AssemblyMetadata GetMetadata(string path)函数下找到.)
| 归档时间: |
|
| 查看次数: |
2324 次 |
| 最近记录: |