In the 创建和发布包 http://docs.nuget.org/Create/Creating-and-Publishing-a-Package据说 NuGet 使用AssemblyVersionAttribute
令牌时的属性$version$
用来。
深入研究 NuGet 源代码,我发现它并不像人们想象的那么简单。
NuGet 使用反射来获取库的版本。AssemblyName.Version
准确地说。由于版本的所有组成部分都必须是大于或等于零的整数(请参阅程序集名称.版本 https://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.version%28v=vs.110%29.aspx#Remarks),提供的版本是 1.0.0.0 (在您的情况下)而不是您中声明的 1.0.0AssemblyVersion
属性。
可能的解决方案
The 核规格参考 http://docs.nuget.org/Create/Nuspec-Reference页面旁边添加了更多信息$version$
令牌。它提到AssemblyInformationalVersionAttribute
属性将优先于AssemblyVersionAttribute
。使用它会解决您的问题。
深层发掘
你可能想知道为什么会AssemblyInformationalVersionAttribute
工作和AssemblyVersionAttribute
won't?
这个问题的答案是 NuGet 使用CustomAttributeData.GetCustomAttributes(Assembly)
函数在使用 Assembly.Version 之前检索库的属性。上面的函数就不一一列举了AssemblyVersionAttribute
,但它会列出AssemblyInformationalVersionAttribute
如果它被用在组件上。
只有这样,如果未找到 AssemblyInformationalVersionAttribute,才会使用 Assembly.Version。
EDIT:
相关NuGet源代码:
NuGet 使用以下代码获取程序集版本(如果未找到 AssemblyInformationalVersionAttribute):
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(path);
AssemblyName assemblyName = assembly.GetName();
...
version = new SemanticVersion(assemblyName.Version);
问题始于 assembly.GetName(),因为它使用相关参数(包括版本)创建并初始化 AssemblyName。
(该代码可以在程序集元数据提取器 http://nuget.codeplex.com/SourceControl/latest#src/Core/Authoring/AssemblyMetadataExtractor.cs类,下public AssemblyMetadata GetMetadata(string path)
功能。)