我正在寻找有关如何管理.NET组件的三个不同的汇编版本编号的指针,建议甚至说法。产品版本是最简单的,因为这通常是由业务决定的。然后,文件版本似乎是用于在部署之间进行版本的版本,其中仅在运输时才使用实际的汇编版本。

现在,我只是在寻找一种简单的装置标记测试和维护版本的方法,而无需依赖它,因此我正在考虑在文件版本上进行自动启动构建和修订号,以及最终版本,复制当前汇编版本的文件版本。该产品正在生产中,但仍在开发中 - 您知道 - 那些小公司之一,没有变更控制基础设施情况。

有帮助吗?

解决方案

版本控制是我非常热衷的东西,并且花了很长时间试图提出易于使用的版本控制系统。从您的问题中您已经说过的话可以很明显,您已经了解了一个重要的一点,汇编版本编号不是产品版本的代名词。一个是技术上的,另一个是由业务驱动的。

以下假设您使用某种形式的源控制和构建服务器。对于上下文,我们使用 团队 和颠覆/git。 Teamcity对于少量(10)个项目是免费的,并且是一个非常好的构建服务器,但是还有一些完全免费的。

版本号是什么意思

一个版本对一个人意味着与他人不同的意义,一般结构是主要的,次要的,宏观的,微型的。我看版本编号的方式是将其分为两个部分。上半年描述了主版本(专业)和任何密钥更新(次要)。下半年指示何时构建以及源代码版本是什么。版本号也意味着不同的内容取决于上下文,是API,Web应用程序等。

Major.Minor.Build.Revision

  • Revision 这是从源控件中获取的数字来确定实际构建的内容。
  • Build 这是一个越来越多的数字,可用于在构建服务器上找到特定的构建。这是一个重要的数字,因为构建服务器可能已经两次使用不同的参数构建了相同的源。将构建号与源编号结合使用,使您可以识别构建的内容和方法。
  • Minor 这只有在公共界面发生重大更改时才会改变。例如,如果是API,则消费代码仍然可以编译吗?当主要数字更改时,该数字应重置为零。
  • Major 指示您使用的产品的哪个版本。例如,所有VisualStudio 2008组件的专业均为9,而VisualStudio 2010为10。

规则的例外

该规则总是有例外,当您遇到规则时,您将必须适应。我最初的方法是基于使用颠覆的,但最近我已经搬到了git。使用中央存储库的源控件诸如Subversion和Source Safe具有一个数字,可用于从给定时间识别一组特定的来源。分布式源控制(例如GIT)并非如此。由于GIT使用每个开发机上的分布式存储库,因此您可以使用自动增量数字,因此有一个黑客使用校验数,但它很丑陋。因此,我不得不发展自己的方法。

Major.Minor.Macro.Build

修订号现在已经消失了,构建已转移到了过去的修订版,并且插入了宏。您可以使用宏观观看的宏,但是大多数时候我不理会它。因为我们使用Teamcity在构建中可以找到从修订号中丢失的信息,这确实意味着有两个步骤的过程,但我们没有丢失任何东西,并且是可以接受的折衷方案。

设置什么

首先要了解的是,汇编版本,文件版本和产品版本不必匹配。我并不是在提倡拥有不同的数字集,但是当对组件进行小小的更改时,它不会影响任何不受被迫重新编译依赖的组件的公共接口。我处理的方式是仅设置汇编版本中的主要和次要数字,而要设置文件版本中的所有值。例如:

  • 1.2.0.0(装配体)
  • 1.2.3.4(fileversion)

这使您能够推出热门修复程序,这不会破坏现有代码,因为汇编版本不匹配,但可以通过查看其文件版本编号来查看汇编的修订/构建。这是一种常见的方法,当您查看组件详细信息时,可以在某些开源组件上看到。

您作为团队负责人将需要负责在需要破坏变更时递增次要数字。推出对接口所需更改的一种解决方案,但不要打破先前的代码,以将当前的代码标记为已过时并创建新界面。这意味着警告现有代码,该方法已过时,可以随时删除,但不需要您立即破坏所有内容。然后,当一切迁移时,您可以删除过时的方法。

如何将其连接在一起

您可以手动完成所有上述所有操作,但这将非常耗时,以下是我们自动化过程的方式。每个步骤都是可以运行的。

  • 去除那个 AssemblyVersionAssemblyFileVersion 来自所有project assemblyInfo.cs文件的属性。
  • 创建一个通用的汇编信息文件(调用IT versionInfo.cs),并将其作为链接项目添加到您所有项目中。
  • 添加 AssemblyVersionAssemblyFileVersion 具有“ 0.0.0.0”值的版本属性。
  • 创建一个构建解决方案文件的MSBUILD项目。
  • 在构建之前添加任务,以更新版本ininfo.cs。有许多开源MSBUILD库,其中包括一个可以设置版本号的汇编任务。只需将其设置为任意号码和测试即可。
  • 添加一个属性组,其中包含构建编号每个段的属性。这是您设置专业和次要的地方。构建和修订号应作为参数传递。

颠覆:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

希望我很清楚,但涉及很多。请问任何问题。我将使用任何反馈将更简洁的博客文章放在一起。

其他提示

汇编]在.NET中是非常重要的。微软鼓励的一种理念是,您让它自动灌溉,强迫 全部 取决于要重新编译的大会的项目。如果使用构建服务器,则可以正常工作。从来没有 错误的 要做的事情,但要当心携带剑的人。

另一个与其实际含义更加紧密相关的是,该数字代表了总成的公共界面版本。换句话说,只有在更改公共界面或类时才会更改它。由于只有这样的更改,需要重新编译大会的客户。不过,需要手动完成此操作,构建系统不足以自动检测此类更改。

您可以仅通过将组件部署在覆盖范围之外的机器上时,进一步扩展此方法。这是Microsoft使用的方法,他们的.NET组件版本编号很少发生变化。主要是因为它给客户带来了非常巨大的痛苦。

因此,Microsoft讲道的不是它的实践。但是,它的构建过程和版本控制控制是无与伦比的,他们甚至拥有一名专门的软件工程师来监视该过程。效果不太好,Waithandle.Waitone(int)过载特别效果 造成相当多的痛苦. 。用非常不同的方法固定在.NET 4.0中,但这超出了范围。

这取决于您和您对如何控制构建过程和释放周期的信心,以做出自己的选择。除此之外,自动向[汇编fileversion]自动自动进行非常合适。但是给这是不便的 不是 支持的。

您可以将版本编号的构建部分用于自动收入。

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

在您的环境中,测试版本是一个具有构建版本!= 0的版本。在版本上,您将次要零件递增并将构建零件设置为0,这就是您将如何识别发布的汇编。

如果您将组件安装在GAC中,您的GAC会随着时间的流逝而被大量不同的版本淹没,因此请记住这一点。但是,如果您仅在本地使用DLL,我认为这是一个很好的做法。

添加 bronumskis答案, ,我想指出的是,在语义版本管理2.0标准之后 semver.org, Major.Minor.Build.Revision 由于规则增加了一个数字后,权利的所有常规值都必须重置为零,因此是非法的。

遵循标准的更好方法是使用 Major.Minor+Build.Revision. 。这是不适合使用的 AssemblyVersionAttribute, ,但是可以使用自定义属性或静态类。

SEMVER在Teamcity中应使用Meta-Runner Power Pack提供。对于用git-flow(尤其是在.net世界)的git,我发现 gitversion 有帮助。

在版本化组件方面,没有艰难而快速的规则,因此请随时尝试对您有用的东西,但是我建议您使用4个零件方法,因为您将拥有flexiblity ins ins in to flexibase,您想进行一些更改在将来。

... for ex:1.0.0。*

保留 - 这增加了额外的灵活性,即将来临,您想在将来做出任何更改。但默认情况下,将其保留为0。

另外,考虑使用强钥匙签名。这将解决汇编冲突问题,因为您在GAC中注册了多个版本的汇编版本。 MSDN链接

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top