简介
了解软件的版本标识含义、版本号语义,才能帮我们更好的选择软件版本,处理依赖等。
例如,软件包gradle-9.2.0-rc-3-bin.zip中的rc代表什么意思?
例如,项目中有下面的依赖,我们怎么处理呢?从哪里开始着手分析呢?
- 我们项目->A->Z@1.4.2
- 我们项目->B->Z@1.7.8
- 我们项目->C->Z@2.1.0
- 我们项目->D->E->Z@1.9.3
通常Maven、Gradle这类构建工具会帮我们自动处理依赖问题。
Maven会采用最短路径原则,Gradle会采用最高版本原则。
但是,当项目复杂之后,很容易就冲突了,还是需要我们手动去处理。
相信很多做前端的朋友深有体会,为什么我只是简单的加入了一个依赖,我的npm就不对了?
理解了版本号的语义,我们就能更好的处理这些问题。
例如,上面我们提的依赖问题,如果知道版本号的语义,我们就会首先去解决C的版本依赖,因为它依赖的Z的主版本major是2,和其他包依赖的1.x.z是API不兼容的。
如果,我们自己要发布开源软件,了解版本号语义就更重要了,例如,我们软件版本1.2.3,做了一个不兼容升级,版本号修改为1.2.4,如果别人使用了npm ^1.2.3类似的版本,自动拉取了1.2.4的包,然后版本不兼容,不就玩死别人了。

Alpha(α)
预览版,也叫内部测试版,一般不向外部发布,会有很多Bug,主要是内部人员用于测试。
很多开源软件的大版本也会释放出来,让大家一起来找茬。
例如:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-alpha1</version>
</dependency>
Beta(β)
测试版,也叫公开测试版,在 Alpha版之后推出。我们基本不会不会看到Alpha版本,但是很多开源软件会在其官网提供Beta版本。
同样是log4j-api的2.0版本释放了9个Beta版本:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0-beta9</version>
</dependency>
RC(Release Candidate)
最终测试版本,最终产品的候选版本,从名字也能看出来,是Release的候选者,如果没有发现新的Bug则发布成为正式版本。
多数开源软件会推出两个RC版本,最后的 RC2 则成为正式版本,例如,log4j-2.15.0-rc2最后就变成了正式的log4j-2.15.0版本。
当然rc不一定都对只有2个版本,例如:
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-core</artifactId>
<version>7.3-rc-5</version>
<scope>provided</scope>
</dependency>
Stable
稳定版,来自预览版本释出使用与改善而修正完成。
如Nginx就会有:
- Mainline version:Mainline 是 Nginx 目前正在做的版本
- Stable version:最新稳定版,生产环境上建议使用的版本
- Legacy versions:遗留的老版本的稳定版
GA(General Availability)
正式发布的版本,如:
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.28.0-GA</version>
</dependency>
Milestone
通常文件名中包含有milestone或者m1、m2、m3等的版本就是里程碑版本,通常是软件既有重大意义的版本。
Latest
Latest表示最近最新版本
版本号说明
规范的项目的软件版本号分3段:主版本号.次版本号.修订号(MAJOR.MINOR.PATCH)
- 主版本号(major):做了不兼容的 API 修改
- 次版本号(minor):做了向下兼容的功能性新增
- 修订号(patch):做了向下兼容的问题修正,只要有修改就增加
我们以npm的版本号规则为例来说明:
| 版本符号 | 含义 | 版本说明 |
|---|---|---|
| ^ | 兼容版本 | 使用兼容版本的最新版本,major大于0锁定major:1.x.y,major等于0锁定minor:0.1.x |
| ~ | 锁定major和minor版本,相当于只更新问题修复的版本 | ~1.4.2就相当于1.4.x版本 |
| > | 大于 | >4.1.0,只能使用大于4.1.0的版本,相当于版本兜底,意味着自己只兼容4.1.0以上的api |
| < | 小于 | < 3.0.0,版本上限,通常指定主版本,因为主版本不一样,api不兼容 |
| * | 任意版本 | 1.x / * |
注意:肯定会使用最新版本,例如我们配置1.1.0,最开始当只有1.1.0的时候使用的是1.1.0,当包有新版本1.1.1的时候,npm会自动升级使用1.1.1。
为什么可以这么操作呢?
因为^可以保证主版本不变,也就意味着包不会有不兼容的API修改。
还有一点需要注意的是当主版本major为0的时候,^锁定的是次版本minor,因为major为0说明软件本身就还是不稳定的状态。

1万+

被折叠的 条评论
为什么被折叠?



