我的公司正在生产一种产品。将由 SVN 进行版本控制。这是一个网络应用程序,所以基本上不会有一个版本没有一些功能,因此总是可以标记为测试版。但由于它将是一个企业产品,我真的不希望“不稳定的监视”在那里。那么如何进行版本控制呢?1.0稳定吗?生成日期是否应该在版本号中?告诉我你们的想法!
如果它在 SVN 中,那么为什么不使用 SVN 修订号呢?
如果你看这个网页的右下角,你会看到 Stack Overflow 版本号,它是 SVN 的修订号。
现在只使用 Subversion 修订号非常流行。
或者使用你的“思想”版本号逗号颠覆版本号. 。 Z.B. :
1.0.101//版本101,发布
或1.0.101.090303//带发布日期,我使用这个
X.y.z.g
G 的增量是不稳定的 Z 中的增量是稳定的,并且是修复 bug 的平均值。 Y 的增量是稳定的并且是平均的新特征。 X 的增量是稳定的,主要的释放没有100% 的向下兼容。
从 Wikipedia: 软件版本号中获得一些灵感
另一个“新”和“相对受欢迎”的选项是 语义版本控制
摘要:
给定版本号 MAJOR.MINOR.PATCH,增加: 当您进行不兼容的 API 更改时, 以向后兼容的方式添加功能时的 MINOR 版本,以及 在修复向后兼容的 bug 时使用 PATCH 版本。 用于预发布和构建元数据的附加标签如下所示 对 MAJOR.MINOR.PATCH 格式的扩展。
给定版本号 MAJOR.MINOR.PATCH,增加:
用于预发布和构建元数据的附加标签如下所示 对 MAJOR.MINOR.PATCH 格式的扩展。
版本控制取决于您; 我会在我有信心的第一个版本上安装1.0。您可能希望快速跟进其他版本,因为一些软件供应商给1.0带来了不好的名声。
您确实希望以某种方式将版本号与所使用的精确版本绑定在一起,但是您可能希望它对于最终用户来说是漂亮和简单的。考虑使用标准版本号,并用包含的版本号标记 SVN 存储库。
我曾经为我的一个大型项目写过一个详细的“版本控制样式指南”。该项目未能实现,但风格指南是 仍然可以在网上找到。这是我个人的观点,也许对你有帮助(或鼓舞)。
注意,这是一篇很长的文章,涉及到组件版本控制和产品版本控制之类的东西。它还表达了对一些在 OSS 社区中流行的版本控制方案的强烈意见,但是我有这些意见,所以我表达了它们。;-)
例如,我不同意使用 Subversion 修订号。您可能希望在 TRUNK 中继续开发的同时维护一个已发布的版本,因此您将设置一个维护分支-并且您的修订号版本控制将付诸东流。
编辑: 作为一个总结,它区分了源文件、组件和整个产品的版本控制。它对组件和产品使用一个独立的 x.y 版本控制系统,两者之间有很好的相互依赖关系,这使得跟踪哪个组件版本属于哪个产品版本变得不重要。它还讨论了如何在不破坏系统的情况下处理 alpha/beta/release/patch 循环。实际上,这是整个开发周期的一种工作方式,所以您可能需要精挑细选。;-)
编辑2: 由于有足够多的人认为我的文章有用,所以我重新开始写这篇文章。PDF 和 LaTeX 版本现在可用,一个完整的重写,包括更好的语言和解释性图形将随后尽快我可以找到的时间。谢谢你们的投票!
虽然使用 Subversion 修订号非常简单,但它确实会从版本号中删除信息。用户可能会认为这是一件坏事。
我假设您的 Web 应用程序将具有某种部署过程,这样 Subversion 中的每个修订实际上都不会发布。由于从“外部”(从用户的角度)不可能确定何时发布,以及代码之间将经历多少次修订,因此这些数字几乎是随机的。他们将会增加,我猜测这是可能的,从 一些的距离比较两个修订,但不多。
经典的版本号倾向于“戏剧化”发布,这样用户就可以建立某种期望。比起思考“昨天我们运行了 SO 修订版2587,今天是3233,它一定要好得多!”,我们更容易想到“我有1.0版本,现在1.1版本出来了,添加这个和那个,听起来很有趣!”.
当然,这种戏剧化也可能被夸大,公司选择的版本号听起来比产品的实际差异更有趣,我猜与修订号计数器这一点。
我在这方面的经验很少,不过,我会这么做:
当然,您可以只使用 svn 修订号——就像许多其他人建议的那样! ! !
希望这个能帮上忙。
[ 少校]。[ 未成年人]。[ 释放]。[ 建造]
真是一个营销决策。准备好调用1.0版本了吗?该公司是否认为这是一个主要的版本,客户可能需要支付更多,或者它是当前的主要版本的更新,可能是免费的?与其说是研发决策,不如说是产品决策。
小 : 每当 少校增加时从0开始。每个发布的版本 + 1。
Release : 每当您达到一个开发里程碑并发布产品时,甚至在内部(例如到 QA) ,都要增加这个。这对于组织中的团队之间的沟通尤其重要。不用说,永远不要两次发布相同的“版本”(甚至在内部)。在次要 + + 或主要 + + 上重置为0。
Build : 可以是 SVN 修订版,我发现这样最好。
例子 我现在的铬: 83.0.4103.61
“版本号”是内部版本控制系统的问题。发布号是另一回事(并且应该保持不同)。
坚持使用简单的 MAJOR.MINOR 发布系统(如1.27版本) ,其中 MAJOR 是兼容级别(2.x 版本与1.x 版本不兼容,或者至少与1.x 版本有很大不同) ,MINOR 是你的 bug 修复版本或次要增强版本。只要遵循 X.Y 格式,您还可以使用其他系统,如 YAR.MONTH (2009.12)或 YAR.RELEASE (2009.3)。但实际上,你最好还是坚持少校。除非你有一个很好的理由不这样做。
绝对不要使用任何不符合 X.Y 格式的东西,因为它会使发行版、公告网站等很难与你合作,而这本身就会严重影响你的项目的受欢迎程度。
在您的(最好是分布式的)版本控制系统中使用分支和标记来分别标记与 MAJORS 和 MINORS 相关的特定内部版本号。
是的,1.0应该是稳定的。所有版本都应该是稳定的,除非它们被标记为 alpha、 beta 或 RC。使用阿尔法表示已知的破碎和不完整。已知破碎的贝塔。RCs 的意思是“尝试一下; 你可能会发现我们遗漏的东西”。任何没有其中之一的东西都应该(理想情况下,当然)进行测试,知道良好,有一个最新的手册,等等。
我们已经花费了太多的时间来决定何时增加主版本。有些商店很少这样做,所以你会有像1.25.3这样的发行版,其他商店会一直这样做,给你15.0版本
我对此感到厌烦,并说服每个人主要发行号码只是一年,未成年人只是一个连续发行在一年内。用户似乎很喜欢它,想出下一个版本号也是显而易见的。
年,释放,构建
剪辑
这是一个不断增强的内部应用程序
这可能不适用于商业应用程序,因为出于营销和财务目的,在一年中的不同时间发布主要应用程序是很重要的。
这个问题之所以存在,是因为我们没有一个统一的组态管理。
我喜欢这样做的版本号只是增量整数从1。我不想要一个多部分的版本号,我将不得不解释或文件。我不想使用 SVN 转速,因为这也需要一些解释。
您需要在 SVN 之上使用一些发布脚本来实现这一点
我们使用一个简单的 Major. minor.julian _ date 语法。
何处;
在1/15推送到 QA 的第一个版本的示例是-> 1.0.015 第一个被推到3/4生产环境的版本的例子是-> 1.1.063
它并不完美,但是在我们几乎每天向 QA 推送构建时非常方便。
这里有些好消息:
何时更改文件/程序集版本
首先,文件版本和程序集版本不必相互重合。我建议文件版本随着每次构建而变化。但是,不要为了能够区分同一文件的两个版本之间的差异而在每次构建时更改汇编版本; 应该使用文件版本。决定何时更改程序集版本需要对要考虑的生成类型进行一些讨论: 传送和不传送。
非船舶建造 一般来说,我建议在发布版本之间保持非发布程序集版本相同。这避免了由于版本不匹配而导致的强名称程序集加载问题。有些人喜欢使用发布者策略为每个版本重定向新的程序集版本。但是,我建议不要对非发货构建使用这种方法: 它并不能避免所有的加载问题。例如,如果合作伙伴复制了您的应用程序,他们可能不知道安装发布者策略。然后,您的应用程序将为他们破解,即使它在您的机器上工作得很好。
但是,如果在同一台机器上不同的应用程序需要绑定到不同版本的程序集,我建议给这些构建不同的程序集版本,这样就可以在不使用 LoadFrom/等的情况下为每个应用程序使用正确的版本。
航运业 至于为了发布构建而更改该版本是否是一个好主意,这取决于您希望绑定如何为最终用户工作。您希望这些构建是并排的还是就地的?这两个版本之间有很多变化吗?他们要打击一些顾客吗?您是否关心它会破坏它们(或者您想强制用户使用您的重要更新) ?如果是,则应考虑递增程序集版本。但是,再次考虑这样做太多次可能会使用户的磁盘充满过时的程序集。
更改程序集版本时 为了将硬编码版本更改为新版本,我建议在头文件中为版本设置一个变量,并用该变量替换源中的硬编码。然后,在构建过程中运行一个预处理器以放入正确的版本。我建议在发货后立即更改版本,而不是在发货前更改,这样就有更多的时间来捕捉因更改而产生的 bug。
版本方案: [大调]。[小调]。[德维尔][标记] [ main ] : 如果你在开发中有一个巨大的变化,就会增加。 [ small ] : 如果在开发中有小的变化,则增加。 [ devrel ] : 如果你修复了一个错误,那么增量。如果是大 + + 或小 + + ,那么重置为零。 [ mark ] : a,b 或 rc: a 是 alpha 版本,b 是 beta 版本,rc 是候选版本。注意,像1.3.57 a 或1.3.57 b 或1.3.57 rc 这样的版本是在1.3.57版本之前的。从0.0开始。
基于我在复杂企业平台级依赖管理和发布版本控制方面的经验,我推荐一种我喜欢称为 半语义版本控制的方法。
它基本上是建立在 语义版本2.0的基础上的,但并不那么严格。
半语义版本部分:
<primary.release.segment>[-<pre.release.segment>][+<post.release.segment>]
主要版本分段格式:
市场营销,少校,少校,补丁
每个段都应该允许使用字母数字,但是对于逻辑增量更改,建议使用纯数字。
与 SemVer 类似,我建议使用 主要、次要和补丁组件来表示反向兼容性层,但也建议使用 市场营销部分。这使得产品所有者、特性史诗/组和业务关注点可以独立于技术兼容性关注点而突破主要组件。
与其他答案不同的是,我不建议在主段后面追加一个 Build 编号。相反,在“ +”后面添加一个 释放后环节(例如: 1.1.0.0 + build. 42)。SemVer 称之为构建元数据,但我认为发布后部分更清晰。这个段非常适合声明后缀数据与主 发布环节中的兼容性信息无关。您的持续集成构建可以给出之前的版本号,并附加一个在每个主版本之后重置的增量构建号(比如: 1.1.0.0-> 1.1.0.0 + build. 1-> 1.1.0.0 + build. 2-> 1.1.0.1)。有些人喜欢将 svn 修订号放在这里,或者将 git 提交 sha 放在这里,以便于绑定到代码存储库。另一种选择是使用发布后段来修补和补丁,因此可能值得考虑为此添加一个新的主要发布组件。当补丁组件增加时,它总是可以被删除,因为版本实际上是左对齐和排序的。
除了发布和发布后的部分,人们通常希望使用 预发行部分来表示几乎稳定的预发布版本,如 alpha、 beta 和发布候选版本。SemVer 方法可以很好地解决这个问题,但是我建议将数值组件从 alpha-numeric 分类器(例如: 1.2.0.0 + alpha. 2或1.2.0.0 + RC. 2)中分离出来。通常你会在添加发布后段的同时删除发布前段,然后在下一次删除主段时删除预发布段(比如: 1.0.1.2-> 1.2.0.0-RC 1-> 1.2.0.0)。预发布片段被添加来表明发布版本即将到来,通常只是一组固定的特性,用于更深入的测试和共享,不会随着更多的提交而随时变化。
以涵盖几乎所有用例的方式对所有这些进行语义定义的好处在于,您可以以标准方式解析、排序、比较和增量它们。当使用 CI 系统来处理复杂的应用程序时,这一点尤其重要,因为这些应用程序包含许多独立版本的小组件(比如微服务) ,每个组件都有自己的托管依赖关系。
如果你感兴趣,我写了 Ruby 中的半语义解析器。我不仅需要使用这种模式,还需要能够管理使用它的其他应用程序。
A.B.C.D
递增量: 何时 - D: bug 修复 - C: 维修保养,例如改善工作表现 - B: 新功能 - 一: 架构改变
强制性是最左边的一个,例如,如果有一个新的特性和一个 bug 修复了,那么你只需要增加 B。