如何做版本号?

时间:2009-03-05 15:21:46

标签: version product

我的公司正在构建产品。它将由SVN版本化。它是一个webapp,所以基本上永远不会有一个版本没有其中的某些功能,因此可以始终标记为beta。但由于它将成为一种企业产品,我真的不希望那里出现“不稳定的监视”。那么你将如何进行版本控制呢? 1.0稳定吗?构建日期应该是版本号吗?告诉我你们的想法!

18 个答案:

答案 0 :(得分:246)

[<强>主要]。[<强>次要]。[<强>释放]。[<强>构建

专业:真的是一个营销决策。你准备好打电话给1.0版吗?公司是否认为这是客户可能需要支付更多费用的主要版本,还是可能是免费的当前主要版本的更新?较少的R&amp; D决定和更多的产品决策。

次要:每当 major 递增时,从0开始。每个公开的版本都有+1。

发布:每当您点击开发里程碑并发布产品时,即使在内部(例如QA),也要增加它。这对于组织中的团队之间的沟通尤为重要。不用说,永远不要发布两次相同的'发布'(甚至内部)。在次要++或主要++上重置为0。

构建:可以是SVN版本,我觉得效果最好。

答案 1 :(得分:64)

x.y.z.g

g的增量不稳定。 (或RC) z中的增量是稳定的并且意味着错误修复 y的增量是稳定的,意味着新的特征 x中的增量是稳定的,主要版本没有100%向后兼容性。

答案 2 :(得分:33)

我曾经为我的一个大型项目写了一篇精心设计的“版本风格指南”。该项目未能实现,但样式指南为still available online。这是我个人的看法,也许对你有帮助(或鼓舞人心)。

要注意,这是一个很长的文本,并进入组件版本控制与产品版本控制等等。它也对OSS社区中流行的一些版本控制方案表达了强烈的意见,但我有它们,所以我表达了它们。 ; - )

例如,我不同意使用Subversion版本号。您可能希望在继续TRUNK开发的同时维护已发布的版本,因此您将设置维护分支 - 并且您的版本号版本将耗尽。

编辑:总结一下,它区分了版本控制源文件,组件和整体产品。它使用了一个单独的x.y versoning系统,用于组件和产品,两者之间具有良好的相互依赖性,这使得跟踪哪个组件版本属于哪个产品版本是微不足道的。它还讨论了如何在不破坏系统的情况下处理alpha / beta / release / patch周期。实际上,它是整个开发周期的运作方式,所以你可能想要挑选。 ; - )

编辑2:由于有足够多的人发现我的文章很有用,可以将其作为“不错的答案”,我再次开始研究这篇文章。现在可以使用PDF和LaTeX版本,只要能找到时间,我们就会立即进行完整的重写,包括更好的语言和解释性图形。谢谢你的投票!

答案 3 :(得分:29)

从维基百科中获取灵感:"Software versioning"

另一个“新”和“相对受欢迎”的选项是Semantic Versioning

<强>要点:

  

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

     
      
  1. 当您进行不兼容的API更改时的MAJOR版本,
  2.   
  3. 以向后兼容的方式添加功能时的MINOR版本,
  4.   
  5. 当您进行向后兼容的错误修复时的PATCH版本。
  6.         

    预发布和构建元数据的其他标签可用作   MAJOR.MINOR.PATCH格式的扩展。

答案 4 :(得分:9)

<强> A.B.C.D

增量:当时   - d :错误修复
  - c :维护,例如绩效改善
  - b :新功能
  - a :架构更改

强制性是最左边的,例如如果有新功能和错误修复,那么你只需要增加 b

答案 5 :(得分:8)

根据我在复杂的企业平台级依赖关系管理和发布版本控制方面的经验,我推荐了一种我喜欢称之为半语义版本控制的方法。

基本上它建立在Semantic Versioning 2.0之上,但不是那么严格。

半语义版本细分:

<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]

主要版本段格式:

  

MARKETTING.MAJOR.MINOR.PATCH

每个片段应允许使用字母数字,但建议使用纯数字进行逻辑增量更改。

与SemVer一样,我建议使用 Major,Minor和Patch组件来表示反向兼容性层,但我还建议预先添加营销组件。这使得产品所有者,功能史诗/群组和业务问题可以独立于技术兼容性问题而突破主要组件。

与其他答案不同,我不建议在主段上附加内部版本号。相反,在“+”之后添加发布后细分(例如:1.1.0.0 + build.42)。 SemVer调用此构建元数据,但我认为Post-Release Segment更清晰。此细分非常适合将后缀数据声明为与主要版本细分中的兼容性信息无关。然后,可以为您的持续集成构建提供先前版本号,该编号附加了在每个主要版本之后重置的增量版本号(例如:1.1.0.0 - &gt; 1.1.0.0 + build.1 - &gt; 1.1.0.0 + build.2) - &gt; 1.1.0.1)。有些人喜欢将svn版本号放在这里或者使用git commit sha来使它易于绑定到代码库。另一种选择是将后发布段用于修补程序和修补程序,因此可能值得考虑为此添加新的主要版本组件。当补丁组件递增时,它总是会被丢弃,因为版本实际上是左对齐和排序的。

除了发布和发布后细分,人们通常还希望使用预发布细分来表示几乎稳定的预发布,例如alphas,beta和候选发布。 SemVer的方法效果很好,但我建议将数字组件与字母数字分类器分开(例如:1.2.0.0 + alpha.2或1.2.0.0 + RC.2)。通常,您会在添加释放后段时同时碰撞释放段,然后在下次碰撞主要版本段时删除预发布段(例如:1.0.1.2 - &gt; 1.2.0.0-RC.1) - &gt; 1.2.0.0)。添加预发布段以表明发布版本即将发布,通常只是一组固定的功能,可以进行更深入的测试和共享,而不会根据更多的提交而每分钟更改一次。

以一种涵盖几乎所有用例的方式对所有这些语义进行定义的美妙之处在于,您可以以标准方式对它们进行解析,排序,比较和递增。这一点尤其重要当CI系统用于具有许多小型独立版本组件(如微服务)的复杂应用程序时,每个组件都有自己的托管依赖项。

如果您有兴趣,我写了a semi-semantic parser in ruby。我不仅需要使用此模式,还能够管理其他使用它的应用程序。

答案 6 :(得分:3)

“版本号”是内部版本控制系统的问题。发行号是另一回事(应该与KEPT不同)。

坚持使用简单的MAJOR.MINOR发布系统(如v1.27),其中MAJOR是兼容级别(版本2.x与版本1.x不兼容或至少与版本1.x完全不同),MINOR是您的错误修复版本或小改进。只要您遵循X.Y格式,您还可以使用其他系统,如YEAR.MONTH(2009.12)或YEAR.RELEASE(2009.3)。但是你真的最好坚持MAJOR.MINOR,除非你有充分的理由不这样做。

绝对不要使用任何不符合XY格式的内容,因为它会让发行版,公告网站等与您合作变得困难,而这一点可能会严重影响您项目的受欢迎程度。

在您的(最好是分布式)版本控制系统中使用分支和标签,将特定内部版本号分别标记为与MAJORS和MINORS相关。

是的,1.0应该是稳定的。所有版本都应该是稳定的,除非它们标记为alpha,beta或RC。使用Alphas进行已知破碎和不完整。已知破碎的贝塔斯。 RCs“尝试它;你可能会发现我们错过的东西”。任何没有其中任何一个的东西(理想情况下)应该进行测试,已知良好,有最新的手册等。

答案 7 :(得分:2)

版本控制取决于您;我对自己有信心的第一个版本放了1.0。你可能想要快速跟进其他版本,因为一些软件供应商给了1.0一个坏名声。

您确实需要某种方法将版本号绑定到所使用的确切版本,但您可能希望它对您的最终用户来说既简单又简单。请考虑使用标准版本号,并使用版本号标记SVN存储库。

答案 8 :(得分:2)

虽然只是使用Subversion版本号很简单,但确实从版本号中删除了信息。用户可能会认为这是件坏事。

我认为您的webapp将具有某种部署过程,因此Subversion中的每个修订版都不会实际发布。由于不可能从“外部”(从用户的角度)确定何时发布版本,以及代码将在它们之间进行多少次修订,因此数字几乎是随机的。它们会增加,我想有可能推测某些距离比较两个版本,但不是很多。

经典版本号往往会“戏剧化”版本,因此用户可以构建某种期望。更容易想到“我有版本1.0,现在版本1.1正在添加这个和那,这听起来很有趣”而不是想“昨天我们运行SO版本2587,今天它是3233,它必须好多了!”。

当然,这种戏剧化也可能会被夸大,公司选择的版本号听起来比产品的实际差异更有意思,我猜这个版本号会对此有所反击。

答案 9 :(得分:2)

现在很流行使用Subversion版本号。

答案 10 :(得分:2)

版本方案:[专业]。[未成年人]。[devrel] [标记]
[专业]:如果你的发展发生剧烈变化,就会增加 [未成年人]:如果您的发展有轻微变化,则增加 [devrel]:如果你有bug修复就增加。如果是主要++或次要++,则重置为零 [mark]:a,b或rc:a是alpha版本,b是beta版本,rc是候选版本。请注意,1.3.57a或1.3.57b或1.3.57rc等版本在版本1.3.57之前。从0.0.0开始。

答案 11 :(得分:2)

如果它在SVN中,为什么不使用SVN修订版号?

如果您查看此网页的右下角,您将看到Stack Overflow版本号,即SVN版本号。

答案 12 :(得分:1)

我们花了太多时间决定何时增加主要版本。有些商店很少这么做,所以你会有1.25.3这样的版本,而其他商店会为你发行版本给你15.0

我厌倦了这一点,并说服每个人主要版本号只是一年而未成年人只是在一年内连续发布。用户似乎喜欢它,并且想出下一个版本号是不费脑子的。

Year.Release.build

  • 年=当年
  • release =序列号的公开发布版 新功能 - 每次重置为1 年
  • build =增加了bug 修复和内部版本

编辑

**现在这是一个不断增强的内部应用程序**

这可能不适用于商业应用,因为在一年中的不同时间进行重大发布以进行营销和财务目的非常重要。

答案 13 :(得分:0)

我在该地区的经验很少。但是,这就是我要做的事情:

  1. 选择编号修订的方案并坚持下去。始终如一。
  2. 每个版本更改都应代表重大更改。变更的重要程度以及版本号中反映的变更级别由您决定。
  3. 当然,您可以使用svn版本号 - 就像许多其他人建议的那样!!!

    我希望这会有所帮助。

答案 14 :(得分:0)

存在这个问题的原因是因为我们没有一个单独的方式来进行配置管理。

我喜欢做版本号的方式只是从1开始的增量整数。我不想要一个我需要解释或记录的多部分版本号。而且我不想使用SVN转数,因为这也需要一些解释。

您需要在SVN之上使用一些发布脚本来实现这一目标

答案 15 :(得分:0)

我们使用简单的major.minor.julian_date语法。

其中;

  • major - 第一个版本是1,然后当我们介绍主要的新功能或更改如此重要时,它们不向后兼容增加这个数字。
  • minor - 主要里程碑版本。对于按生产推动的每个构建,这个数字会增加。
  • julian_date - Julian Day构建被推送到QA。

在1/15推送到QA的第一个版本的示例是 - &gt; 1.0.015
在3/4上推送到Production的第一个版本的示例是 - &gt; 1.1.063

这并不完美,但是我们每天都会将构建推向QA。

答案 16 :(得分:0)

这里有一些好消息:

When to Change File/Assembly Versions

首先,文件版本和汇编版本不需要相互重合。我建议每个版本都会更改文件版本。但是,不要只为每个构建更改程序集版本,以便您可以区分同一文件的两个版本;使用文件版本。决定何时更改程序集版本需要考虑要考虑的构建类型:运输和非运输。

非运输建筑 通常,我建议在运输版本之间保持非运输组件版本相同。这避免了由于版本不匹配而导致强烈命名的程序集加载问题。有些人更喜欢使用发布者策略来重定向每个构建的新程序集版本。但是,对于非运输版本,我建议不要这样做:它不能避免所有加载问题。例如,如果合作伙伴对您的应用进行x复制,则他们可能不知道安装发布商政策。然后,即使它在您的计算机上运行正常,您的应用也会被破坏。

但是,如果有同一台机器上的不同应用程序需要绑定到程序集的不同版本,我建议为这些版本提供不同的程序集版本,以便可以使用每个应用程序的正确应用程序,而无需使用LoadFrom /等

运输建设 至于为运输版本更改该版本是否是一个好主意,它取决于您希望绑定如何为最终用户工作。您是否希望这些版本并排或就地?这两个版本之间有很多变化吗?他们打算打破一些客户吗?你是否担心它会破坏它们(或者你是否想强迫用户使用你的重要更新)?如果是,则应考虑增加程序集版本。但是,再一次,考虑到这样做太多次可能会使用过时的程序集丢弃用户的磁盘。

更改装配版本时 要将硬编码版本更改为新版本,我建议将变量设置为头文件中的版本,并将源代码中的硬编码替换为变量。然后,在构建期间运行预处理器以输入正确的版本。我建议在发货后立即更换版本,而不是之前,以便有更多时间来捕获由于更改而导致的错误。

答案 17 :(得分:-3)

或者使用你的'思想'版本号逗号颠覆号码.. z.B:

1.0.101 //修订版101,发布

或1.0.101-090303 //发布日期,我使用此