【问题标题】:How to increment automatically the version of an assembly if there are changes on the code?如果代码发生更改,如何自动增加程序集的版本?
【发布时间】:2011-01-10 09:34:58
【问题描述】:

如果在构建解决方案后程序集发生更改,是否有一种方法可以自动增加程序集的版本号?

我已经尝试过构建后事件,但随后您会在每次构建时增加版本,不仅是在构建过程由于更改而编译任何内容的情况下。

提前致谢。

编辑:我想要做的是自动增加我每次执行“构建解决方案”时更改代码的程序集的版本号,以避免手动更改它。这样我就可以确定 2 个具有相同版本的程序集总是具有相同的代码。

【问题讨论】:

  • 您为什么要这样做?如果您告诉我们更多有关您的要求的信息,这将有助于我们根据您的情况提供解决方案。

标签: .net visual-studio assemblies versioning


【解决方案1】:

是的,您可以通过在 [AssemblyVersion] 属性中使用 * 来自动增加版本。不幸的是,这很少是正确的。微软应该做的是赋予 [AssemblyFileVersion] 这种能力。他们没有。

[AssemblyVersion] 是一个非常 重要的属性,CLR 使用它来验证加载的程序集是否与编译代码时使用的程序集兼容。 “兼容”意味着:程序集将与客户端代码一起干净地工作,没有对程序集源代码进行任何更改,如果没有重新编译客户端,可能会使其无法正常工作。使用该定义,错误修复更新非常兼容。重新组织程序集中类的内部实现的更新也可能非常兼容。对公开可见的类或成员的更改可能不兼容。尽管 JIT 编译器非常擅长检测更改何时严重不兼容(例如删除以前的公共成员)。

在属性中使用 * 本质上意味着:它总是不兼容的。即使您根本没有更改任何代码,再次构建后程序集也会不兼容。这在大多数情况下都毫无用处,除非您总是将程序集连同其客户端代码一起构建。并将它们重新部署在一起。这行得通,但是拥有版本号的想法就变得毫无用处了。

长话短说:IMO 您应该自己管理程序集版本。在程序集的公共界面中进行重大更改时更改它。这当然是微软采取的方法。 .NET 2.0 程序集在 .NET 3.5 SP1 框架中仍标记为 2.0.0.0 版本。尽管它们实际上不再兼容,但 WaitHandle.WaitOne(int) 是后来添加的。在过去的 5 年里,他们在保持兼容性方面做得非常出色,这并不容易。

请注意,这不适用于 [AssemblyFileVersion],每次构建时自动递增它是非常合适的。

【讨论】:

  • 更改版本号和修订号并保持主要和次要数字不变会导致程序集不兼容吗?
  • CLR 检查完整版本号,而不仅仅是主要+次要。
  • 嗯,我以为私有部署的程序集没有检查完整的版本号,我错了吗? Jeffrey Richter 写道:“为了实现这种版本控制支持,CLR 将期望修复一个或多个错误的程序集版本将具有相同的主要/次要版本,并且构建/修订号将指示服务版本包含错误修复。加载程序集时,CLR 将自动查找与所请求程序集的主要/次要版本匹配的最新安装的服务版本。对不对?
  • * 不会产生自动版本增量而是自动版本变化,因为数字是随机的。这样我就无法检查版本是否比其他版本旧或新,并且由于很多原因,使用创建日期不可靠。
  • @SoMoS - 这不是随机的。内部版本号是自 2000 年 1 月 1 日以来的天数。修订号来源于时间。
【解决方案2】:

如果我对该过程的理解是正确的,那么当您构建解决方案时,只会重建已更改的程序集(或链接程序集已更改的程序集)。

如果一个程序集根本没有改变,它就不会被重新编译(除非你使用“rebuild all”命令)

所以在我的项目中,在每个项目的 AssemblyInfo.cs 中,我都有这一行:

[assembly: AssemblyVersion("1.0.*")]

这会为我的程序集产生不同的版本号。

【讨论】:

    【解决方案3】:

    如果您想要一个在每次编译完成时更新的自动递增数字,您可以使用预构建事件中的VersionUpdater。与 MSDN 上描述的默认编号机制相比,这具有更多控制的优势。

    【讨论】:

    • 好吧,我真的希望在编译执行某些操作时更新数字,而不是在构建过程发现代码是最新的。
    【解决方案4】:

    我推荐使用这个:https://github.com/dotnet/Nerdbank.GitVersioning

    本工具生成的版本号是根据git信息生成的。这样当你改变你的代码时,版本号就会改变。并且有很多自定义设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 2020-05-23
      • 2011-06-23
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多