获取正确的软件版本号。 V1.0.0.1

时间:2008-09-25 16:57:33

标签: release release-management release-cycle

我在线分发软件,并且总是想知道是否有更好的方法来更好地定义版本号。

让我们假设A.B.C.D在答案中。什么时候增加每个组件?

您是否使用任何其他版本号技巧,例如D mod 2 == 1表示它只是内部版本?

您是否拥有自己版本号的测试版,或者每个版本号都有测试版?

16 个答案:

答案 0 :(得分:29)

我开始喜欢一些应用程序(例如Perforce)使用的Year.Release [.Build]约定。基本上它只是说你发布的那一年,以及那一年内的顺序。所以2008.1将是第一个版本,如果你在一个月或三个月之后发布另一个版本,它将会转到2008.2。

这种方案的优点是没有隐含的“大小”的释放,你可以在这里争论一个特征是否足以保证主要版本增量。

可选附加功能是在内部版本号上进行标记,但这只是出于内部目的(例如,添加到EXE / DLL中,以便您可以检查文件并确保正确构建)。

答案 1 :(得分:8)

在我看来,几乎任何一个发布号码方案都可以或多或少地发挥作用。我使用的系统使用版本号,如11.50.UC3,其中U表示32位Unix,C3是次要修订(修订包)号;其他字母用于其他平台类型。 (我不推荐这个方案,但它有效。)

有一些黄金规则尚未陈述,但这些规则隐含在人们讨论过的内容中。

  • 不要两次发布相同的版本 - 一旦版本1.0.0发布给任何人,它永远不会被重新发布。
  • 发布数量应单调增加。也就是说,版本1.0.1或1.1.0或2.0.0中的代码应始终晚于版本1.0.0,1.0.9或1.4.3(分别)。

现在,在实践中,人们确实必须在较新版本可用时发布旧版本的修复程序 - 请参阅GCC,例如:

  • GCC 3.4.6在4.0.0,4.1.0(和AFAICR 4.2.0)之后发布,但它继续GCC 3.4.x的功能,而不是添加添加到GCC 4.x的额外功能。

因此,您必须仔细构建版本编号方案。

我坚信的另一点是:

  • 发布版本号与CM(VCS)系统版本编号无关,除了普通程序。任何包含多个主源文件的严重软件都将具有与任何单个文件版本无关的版本号。

使用SVN,您可以使用SVN版本号 - 但可能不会因为它变得太不可预测。

对于我合作的东西,版本号是一个纯粹的政治决定。

顺便说一下,我知道从版本1.00到9.53发布的软件,但后来改为2.80。这是一个严重的错误 - 由市场营销决定。当然,该软件的4.x版本已经过时,因此它没有立即造成混淆,但该软件的5.x版仍在使用和销售,并且修订版已经达到3.50。我非常担心当不可避免的冲突发生时,我的代码必须与5.x(旧样式)和5.x(新样式)一起工作。我想我必须希望他们能够在改变到5.x之前直到老5.x真的死了 - 但我并不乐观。我还使用人工版本号(例如9.60)来表示3.50代码,以便我可以进行合理的if VERSION > 900测试,而不必执行:if (VERSION >= 900 || (VERSION >= 280 && VERSION < 400),其中我代表版本9.00乘900然后是版本3.00.xC3中引入的重大变化 - 我的方案未能检测到次要发布级别的变化......发牢骚......发牢骚......

NB :Eric Raymond提供Software Release Practice HOWTO,包括关于命名(编号)版本的(链接)部分。

答案 2 :(得分:7)

我通常使用D作为构建计数器(编译器自动增量) 我每次将构建发布到“public”时都会增加C(并非每个构建都被释放) A和B用作主要/次要版本号并手动更改。

答案 3 :(得分:5)

我认为有两种方法可以回答这个问题,而且它们并非完全互补。

  1. 技术:根据技术任务增加版本。示例:D是内部版本号,C是迭代,B是次要版本,A是主要版本。定义次要版本和主要版本确实是主观的,但可能与基础架构的更改有关。
  2. 营销:根据向客户提供的“新”或“有用”功能的数量来增加版本。您还可以将版本号绑定到更新策略...对A的更改要求用户购买升级许可证,而其他更改则不需要。
  3. 我认为,最重要的是找到适合您和您的客户的模型。我见过一些甚至版本都是公开发布的情况,奇数版本被认为是beta或dev版本。我见过一些忽略C和D的产品。

    然后是Micrsoft的例子,其中对.Net框架版本号的唯一合理解释是涉及营销。

答案 4 :(得分:4)

我们的政策:

  • A - 显着(> 25%)的变化或 添加功能或 接口
  • B - 小变化或 添加功能或 接口。
  • C - 次要改变了 打破界面。
  • D - 修正了一个 构建不会改变 接口

答案 5 :(得分:2)

人们倾向于想要比实际需要更难。如果您的产品只有一个长寿命分支,只需按其内部版本号命名连续版本。如果你有某种“小错误修复是免费的,但你必须支付主要的新版本”,那么使用1.0,1.1 ...... 1.n,2.0,2.1 ...等等。

如果你不能立即弄清楚你的例子中的A,B,C和D是什么,那么你显然不需要它们。

答案 6 :(得分:2)

我对版本号的唯一用途是,客户可以告诉我他们正在使用2.5.1.0版或其他版本。

我的唯一规则旨在最大限度地减少报告该数字时的错误:所有四个数字都必须为1位数

1.1.2.3

没问题,但是

1.0.1.23

不是。客户可能会将这两个数字(至少口头上)报告为“一对一二三”。

自动递增构建号通常会导致版本号如

1.0.1.12537

这也没有什么帮助。

答案 7 :(得分:2)

一个好的非技术方案只使用这种格式的构建日期:

YYYY.MM.DD.BuildNumber

其中BuildNumber是连续数字(更改列表)或者每天从1开始。

示例:2008.03.24.1或2008.03.24.14503

这主要针对内部版本,如果您不是每月发布的次数超过一次,那么公开发布会将版本打印为2008.03。维护版本标记为2008.03a 2008.03b,依此类推。他们应该很少超过“c”,但如果确实如此,那么你需要更好的质量保证和/或测试程序。

用户常见的版本字段应以友好的“2008年3月”格式打印,在“关于”对话框或日志文件中保留更多技术信息。

最大的缺点:只是在另一天编译相同的代码可能会更改版本号。但是你可以通过使用版本控制更改列表作为最后一个数字并检查它来确定日期是否也需要更改来避免这种情况。

答案 8 :(得分:1)

我使用V.R.M,例如2.5.1

V(版本)更改是重大改写
R(修订版)更改是重要的新功能或错误修复 M(修改)更改是次要修补(错别字等)

我有时也会在最后使用SVN提交号。

答案 9 :(得分:1)

在一天结束时,这一切都非常主观,只取决于你自己/你的团队。

只要看看所有答案 - 都非常不同。

我个人使用Major.Minor.*.* - Visual Studio自动填写revison / build编号。这用于我工作的地方。

答案 10 :(得分:1)

本Apple技术说明中描述了一种源于旧Mac OS的良好用户友好版本控制方案:http://developer.apple.com/technotes/tn/tn1132.html

答案 11 :(得分:1)

我喜欢Year.Month.Day。所以,v2009.6.8将是这篇文章的“版本”。不可能(合理地)复制,并且当某些东西是更新的版本时非常清楚。您也可以删除小数并将其设为v20090608。

答案 12 :(得分:1)

对于库,版本号会告诉您两个版本之间的兼容性级别,因此升级会有多困难。

错误修复版本需要保留二进制,源代码和序列化兼容性。

次要版本对不同的项目意味着不同的东西,但通常他们不需要保持源兼容性。

主要版本号可以打破所有三种形式。

我写了更多关于理由here

答案 13 :(得分:1)

在github世界中,跟随Tom Preston-Werner的版本号“semver”规范变得流行。

来自http://semver.org/

  

给定版本号MAJOR.MINOR.PATCH,增加:

     

当您进行不兼容的API更改时的MAJOR版本,MINOR版本   当您以向后兼容的方式添加功能时,以及PATCH   版本,当您进行向后兼容的错误修复时。额外   预发布和构建元数据的标签可用作扩展   到MAJOR.MINOR.PATCH格式。

答案 14 :(得分:0)

对于内部开发,我们使用以下格式。

[Program #] . [Year] . [Month] . [Release # of this app within the month]

例如,如果我今天发布了#15应用程序,并且这是本月的第三次更新,那么我的版本#将是

15.2008.9.3

这完全不标准,但它对我们很有用。

答案 15 :(得分:0)

对于过去的六个主要版本,我们使用了M.0.m.b,其中M是主要版本,m是次要版本,b是内部版本号。所以发布的版本包括6.0.2,7.0.1,......,最高11.0.0。不要问为什么第二个数字总是0;我问了好几次,没有人真的知道。自从1996年发布5.5以来,我们就没有非零。