对于 java 开发,项目联合开发的时候往往是通过maven仓库而不是分支源码依赖进行,而且为了让变更立即可见,需要采用 maven 的 snapshot 版本机制;而对于稳定版本(release版本),为了能够拉取更新以及记录变更,也是需要升级版本号的。也就是说二方库有自己的(maven)版本管理机制, 需要跟 git 的分支机制联动起来。
为了方便说明,我们举一个具体的二方库作为例子。假设有这么一个二方库,它的 pom 文件定义如下:
<groupId>life.arganzheng.internet.ai.platform</groupId>
<artifactId>large-scale-algorithms</artifactId>
<version>1.0.0</version>
目前的稳定版本是 1.0.0
。现在假设 argan 要对这个二方库进行功能开发,按照我们前面讨论的 Git 分支管理策略,他首先拉了一个 feature 分支 —— feature-test-for-maven-version
。然后他把代码 checkout 下来,完成相应的功能开发。
这时候他要把这个新功能开放给同一个项目中的 magi,进行联调。那么 magi 怎么才能拿到 argan 的修改呢?
因为所有的 java jar 包依赖都是通过 maven 管理的,所以 argan 需要提供一个独一为二的 snapshot 版本才能保证 magi 一定能够从 maven 仓库中拉取到他的 jar 包。
简单的将 pom 文件的 version 增加 -SNAPSHOT
,即 1.0.0-SNAPSHOT
很可能会发生冲突,因为其他人也可能同时拉开发分支进行开发。同样,版本号先递增,再增加 -SNAPSHOT
,即 1.0.1-SNAPSHOT
也不能完全排除冲突。
但是回到开发联调这个问题,其实 argan 只需要提供一个独一为二的 snapshot 版本就可以了,所以简单的方式就是在版本号加上一些版本之外的东东,如 他的名字 + Git分支,也就是,argan 可以在开发节点将 feature 分支的 pom 版本修改为 ${开发者名字}-${Git分支名}-${原有分支版本}-SNAPSHOT
:
<groupId>life.arganzheng.internet.ai.platform</groupId>
<artifactId>large-scale-algorithms</artifactId>
<version>argan-feature-test-for-maven-version-1.0.0-SNAPSHOT</version>
这样这个 pom 就是唯一的,magi 只需要将他的 pom 文件对 argan 的这个二方库的依赖的版本也写成 argan-feature-test-for-maven-version-1.0.0-SNAPSHOT
就可以了。
然后双方完成开发和联调之后,再走前文讨论的 Git 分支管理策略,进行分布。但是发布的时候需要把版本号修正成正确的版本号,因为 argan-feature-test-for-maven-version-1.0.0-SNAPSHOT
只是一个开发阶段的临时唯一版本号。发布的时候需要改成唯一的 release 版本号。
这时候可以这么操作,分支代码发布时,根据当前主干的版本号,修改 pom 文件 version,采用如下策略进行升级:
- 新算法开发和算法升级等升级中位版本号。eg: 1.0.0 → 1.1.0
- 小功能和bug fix升级末尾版本号。 eg: 1.0.0 → 1.0.1
- 大的框架层面的优化和重构升级首位版本号。eg: 1.0.0 → 2.0.0
假设到发布的那天主干的版本已经升级为 1.1.2
了,argan 的这个修改是一个比较小的功能修改,那么最终要 release 的版本号就是 1.1.3
。
注: 代码发布后需要使用 mvn deploy
发布到maven仓库。
-
Previous
Git分支管理策略 -
Next
创建Hadoop FileSystem报Provider org.apache.hadoop.fs.azure.NativeAzureFileSystem not a subtype异常