Nuget Pack 不支持程序集版本上的位数

2024-01-25

I need nuget pack生成只有 3 位数字的包版本(我们想对其进行语义版本控制),但是当我在具有AssemblyVersion属性设置为“1.0.0”,生成的 nupkg 文件在其元数据(和文件名)中以版本“1.0.0.0”结尾。为什么命令行工具不支持指定的位数AssemblyVersion属性?

我首先打电话给nuget spec针对 csproj 文件,该文件生成一个像这样的存根 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>

将这个 nuspec 文件签入 TFS 中与 csproj 文件相同的文件夹中后,我们现在可以像这样调用 pack:

nuget pack MyProject.csproj

项目的 AssemblyInfo.cs 文件包含一行用于显式设置版本:

[assembly: AssemblyVersion("1.0.0")]

除了该工具在检索程序集版本时使用 4 位数字之外,一切都工作得很好。当我右键单击文件资源管理器上的 dll 并转到详细信息时,即使 Windows 也仅显示 3 位数字的版本。为什么 NuGet 使用 4 位数字?我是否遗漏了一些明显的东西?

对 nuspec 中的版本进行硬编码显然并不理想,因为这样我们就必须在两个不同的位置维护版本号,而它们的目的是始终相同。我的意思是,这应该是特殊占位符值背后的想法$version$NuGet 本身知道如何从项目中提取。


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)功能。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nuget Pack 不支持程序集版本上的位数 的相关文章

随机推荐

  • heroku:关系“auth_group”不存在

    我在heroku 上执行syncdb 时遇到问题 我有一个自定义用户模型 当我尝试同步时 heroku 给出了此错误 django db utils ProgrammingError relation auth group does not
  • 使用查找其他 Dataframe 中的值来进行 Spark Dataframe 列转换

    我需要通过查找其他数据帧来转换数据帧多列值 右侧的另一个数据框不会有太多行 比如大约 5000 条记录 例如 我需要通过查找正确的数据帧将 field 1 列值替换为 field 1 0 到 8 和 field 1 3 到 25 等比率 所
  • Market Samurai 和 Long Tail Pro 如何处理检索关键字的前 10 个 Google 搜索结果?

    我很好奇 Market Samurai Long Tail Pro 和其他软件如何处理检索前 10 名 Google 搜索结果而不遇到限制 这些软件包似乎使用了用户自己的 Google 帐户 Google 自定义搜索将用户每天的查询次数限制
  • 如何在 C# 中将 XML 元素反序列化为具有属性和文本的元素数组?

    我在尝试反序列化 XML 时遇到问题
  • WPF Prism - 在哪里放置资源?

    我有一个棱镜应用程序和各种模块 我想知道哪里是找到样式 画笔 控件模板 数据模板等资源的最佳位置 我应该制作一个资源字典并将所有内容都放在那里吗 每个模块应该有自己的资源吗 还是每个视图 我想遵循 Prism 保持一切模块化的目标 但我也不
  • 使用 javascript 库跟踪用户活动 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以跟踪用户在网页上的每个操作并创建日志 这个想法是通过 AJAX 将用户操作日志传输到服务器并保
  • Maven WAR 依赖项 - 无法解析包?

    我有战争依赖 性
  • 辞去 ScrollView Touch 上的第一响应者职务

    如何在 ScrollView 触摸事件上隐藏键盘 场景是这样的 gt 视图 gt 滚动视图 gt 文本字段 我想在触摸滚动视图时隐藏键盘 我尝试覆盖滚动视图的类 但仍然无法做到 这样做会有所帮助 interface MyClass
  • 纯分裂的熵计算为 NaN

    我编写了一个函数来计算向量的熵 其中每个元素代表一个类的元素数量 function x Entropy a t sum a t repmat t 1 size a 2 x sum a t log2 a t end e g a 4 0 the
  • 如何在 jsonp ajax 调用中使用 type: "POST"

    我正在使用 JQuery ajax jsonp 我有下面jQuery 代码 ajax type GET url Login aspx Send the login info to this page data str dataType js
  • .erb 、 .rhtml 和 .html.erb 之间有什么区别?

    erb rhtml 和 html erb 之间有什么区别 真的没什么 这只是 Rails 1 和 Rails 2 之间理念的改变 在 Rails 2 之前 有 file rhtml file rxml 和 file rjs 在 Rails
  • 如何生成彼此不相交的正方形(随机定位、大小相等、随机旋转)?

    我一直致力于在 1x1 网格上生成一层随机旋转并放置的正方形 我已经能够生成在网格上随机放置和旋转的单个正方形 但我不确定如何改进代码以生成更多彼此不相交的随机正方形 当前代码如下所示 我的一个随机正方形的示例 https i stack
  • 如何正确重写克隆方法?

    我需要在我的一个没有超类的对象中实现深度克隆 处理检查的最佳方式是什么CloneNotSupportedException由超类抛出 即Object 一位同事建议我按以下方式处理 Override public MyObject clone
  • 通过 Groovy XML 解析器使用字符串作为代码

    我是 groovy 的新手 我希望这是一个简单的问题可以解决 我正在读取 xml 文档 然后我可以访问如下数据 def root new XmlParser parseText xmlString println root foo bar
  • 如何禁用 Google 跟踪代码管理器控制台日志记录

    将 Google 跟踪代码管理器添加到项目后 我在控制台中看到了很多日志条目 有办法禁用它吗 控制台日志充满了噪音 GoogleTagManager info Processing logged event vs with paramete
  • Node.js ENOENT 读取 PDF 文件

    我需要阅读 pdf 文件并使用pdf text extract 它在我的本地主机上完美运行 但是当我尝试在服务器上运行该程序时 出现以下错误 spawn called 0 pdftotext 1 layout enc UTF 8 tmp t
  • Keychain 中存储的字符串有长度限制吗?

    我想在iOS上将一些用户信息作为字符串存储在Keychain中 那么Keychain中的字符串有长度限制吗 Thanks 我组装了一个 iOS 应用程序 可以使用以下命令进行二分搜索这个图书馆 https github com kishik
  • twig - 将函数传递到模板中

    目前 我将函数放在一个类中 并将该类的实例传递到模板中 并将所需的函数作为类方法调用 unneededclass blah 我需要像下面这样做 blah 是否可以 更新 2015 年 5 月 14 日 评论者指出我大部分都是错的 如果您确实
  • 如何合并两个UIImage?

    我正在尝试合并两个不同的图像并创建一个新的图像 这就是我想做的方式 我有这张图片 A 这是一张 PNG 图像 我想将其与我从手机中获取的另一张图像 B 合并 以创建如下所示的图像 我需要一个将 A 与 B 合并创建 C 的函数 尺寸必须保留
  • Nuget Pack 不支持程序集版本上的位数

    I need nuget pack生成只有 3 位数字的包版本 我们想对其进行语义版本控制 但是当我在具有AssemblyVersion属性设置为 1 0 0 生成的 nupkg 文件在其元数据 和文件名 中以版本 1 0 0 0 结尾 为