简介
每个项目的根目录下面,一般都会有package.json文件,定义了这个项目中所需各种模板及项目中的配置信息。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目中所需的运行和开发环境,其中下载的模块版本和node-semver语义化的版本控制系统有关,本文就package.json的版本号组成和版本号解析两部分进行简单介绍。
版本号
版本号格式有以下四种情况,其中连接符是固定的 - | +
- 标准版本号
- 标准版本号-先行版本号
- 标准版本号+编译信息
- 标准版本号-先行版本号+编译信息
总结:版本号 = 标准版本号[-先行版本号][+编译信息]
标准版本号 标准版本代表着代码包的核心版本标识。组成格式为 X.Y.Z,X、Y、Z 均分非负的整数,且均是以递增的方式来增加。X代表主版本号,X的修改,一般意味着代码包有不兼容的修改;Y代表次版本号,Y的修改,一般意味着有向下兼容的新功能出现;Z代表修订号,Z的修改意味着只做了向下兼容的修正。
先行版本号 先行版本代表当前版本并非稳定而且可能无法满足预期的兼容性需求。组成格式为 以句点分隔的标识符,其中标识符由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成,例如1.0.0-alpha、1.0.0-alpha.1。
编译信息 编译信息被标注在标准版本号或先行版本号之后,用于作为编译信息记录,不参与版本号的区别比较。组成格式与先行版本号一致。
版本号的优先级比较
- 判断优先层级时,把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较(编译信息不在这份比较的列表中)。
- 由左到右依序比较每个标识符,第一个差异值用来决定优先层级:主版本号、次版本号及修订号以数值比较。 例如:1.0.0 < 2.0.0 < 2.1.0 < 2.1.1。
- 当主版本号、次版本号及修订号都相同时,改以优先层级比较低的先行版本号决定。 例如:1.0.0-alpha < 1.0.0。
- 有相同主版本号、次版本号及修订号的两个先行版本号,其优先层级由从左到右的每个被句点分隔的标识符来比较,直到找到一个差异值后决定:
- 只有数字的标识符以数值高低比较。
- 有字母或连接号时则逐字以 ASCII 的排序来比较。
- 数字的标识符比非数字的标识符优先层级低。
- 若开头的标识符都相同时,句点分隔的栏位比较多的先行版本号优先层级比较高。
版本号解析
package.json中常见的依赖代码包版本格式:
version
:下载的版本必须与 version 完全匹配。>version
:下载版本必须大于 version。>=version
:下载版本必须大于或等于 version。<version
:下载版本必须小于 version。<=version
:下载版本必须小于或等于 version。~version
:如果只指定主版本号(eg: ~1),则下载的代码包限定在1.x.x;如果指定到次版本号(eg: ~1.2),则下载的代码包限定在1.2.x;如果指定到修订号(eg: ~1.2.3),则下载的代码包限定为 >=1.2.3 且 < 1.3.0。^version
:如果主版本号为0,则效果和~version一致;主版本号不为0(eg: 1.x.x),则下载的代码包为当前主版本号下的最新版本。 1.2.x :下载的代码包大于等于1.2.0且小于1.3.0。*
:下载任何非先行版的代码包。""
:空字符与* 效果一样。version1-version2
:下载版本必须 >=version1且 <=version2。range1||range2
:下载版本符合range1 或 range2的限定,range1 和 range2是一个版本表达式。http://...
:下载指定 url 的代码包。git…
:下载指定 git url 的代码包。user/repo
:下载指定代码仓库中的包。tag
:下载标记并发布为tag的特定版本。path/path/path
:下载的本地路径的代码包。