简述
在平时研发工作中,难免会使用很多市面上的代码包,这些包大多都遵循一个版本号逻辑,例如React
截图来自于npmjs。
可以看到版本号大体上遵循 X.Y.X 的格式;并且版本号严格递增;重要版本可以有先行版本如-next,-experimental等标记;相同版本的先行版本可以有多个,后面跟迭代数和meta信息。
这种广泛使用的版本号逻辑成为semver(Semantic Versioning)语义化版本号。由Github起草,npm团队维护。官网链接
semver 规定了版本号如何显示,如何增加,如何比较以及不同版本号的含义。通过使用统一的版本号方案可以让大型程序有序地对依赖包的版本进行管理,避免出现版本混乱导致整体程序依赖版本被锁死的问题。
关键概念
版本格式
版本格式为 X.Y.Z,其中X为主版本号major,Y为次版本号minor,Z为修订版本号patch。主版本号变更表示有破坏性的更新,次版本号一般为新特性的出现但不包含破坏性更新,修订版本号一般为修复和补丁。
先行版本
当要发布大版本或者核心feature的时候,无法保证这个版本包的功能完全正常,可以发布先行版本。 包括 alpha内侧版本 belta公测版本 rc(release candidate)正式版候选版本,后面可以带上迭代次数信息。需要注意的是先行版本在比较的时候是小于正式版本的,如 1.0.0 > 1.0.0-alpha,npm在安装依赖的时候会自动安装满足版本号的最新依赖,这样也同时保证了不会自动安装上候选版本。
依赖标记
在npm实际引入包的时候,经常会有一些标记 如 ^ ~ = > 等。主要包括
~、>、<、=、>=、<=、-、||、x、X、*
下面解释常用的几个标记的含义
^1.0.0 表示主要版本不可变更 ~1.0.0 表示主要及次要版本不可变更
> < >= <= - 用于指定版本范围,如 >1.0.0, >=1.0.0, 1.0.0 - 1.1.2
|| 表示或 ^2 <2.2 ||> 2.3
X x * 表示通配符,如 1.1.* 1.1.x
npm 安装依赖版本规则
安装依赖时
- 指定版本,会自动更新 package-lock.json 中的对应包的版本
- 安装范围版本的时候,version <= package-lock.json 中的版本号的时候会安装lock文件中的版本,如果高于lock文件中的包的版本,会安装范围中最高的版本,并更新lock文件