npm中的语义化版本原则


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/14/npm%E4%B8%AD%E7%9A%84%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC%E5%8E%9F%E5%88%99/

摘要

本文主要讲述了:

  1. 什么是 semver
  2. 安装
  3. 版本格式
  4. 版本比较符号
  5. 高级范围语法

正文

什么是 semver

npm 根据语义化版原则,实现了semver这个包,用来管理 npm 包的版本。

安装

局部安装

1
2
3
#!/usr/bin/env bash

npm install --save-dev semver

版本格式

参考语义化版本原则一文。

版本比较符号

  • >= 大于等于
  • > 大于
  • = 等于
  • <= 小于等于
  • < 小于
  • ||或空白字符 交集运算符

示例:

  • >1.0.0 || <2.0.0表示介于1.0.02.0.0之间的版本。
  • >1.0.0 <2.0.0表示介于1.0.02.0.0之间的版本。

当版本区间存在prerelease tag时,若版本不存在 prerelease tag,允许比较。

示例:

  • 1.2.3属于>1.2.3-alpha.3区间。
  • 3.4.5属于>1.2.3-alpha.3区间。

当版本区间存在prerelease tag时,若版本也存在 prerelease tag,则只有在两者的major-version.minor-version.patch-version都相同时,才允许比较。

示例:

  • 1.2.3-alpha.71.2.3-beta.71.2.3-rc.7属于>1.2.3-alpha.3区间。
  • 3.4.5-alpha.9不属于>1.2.3-alpha.3区间,虽然从语义化版本原则上来说,3.4.5-alpha.91.2.3-alpha.3高。
  • 3.4.5-alpha.9不属于>1.2.3区间,虽然从语义化版本原则上来说,3.4.5-alpha.91.2.3高。

这么做的原因有 2 点:

  1. pre-release-version 更新快速且频繁,其中可能包含破坏式变更,不适合用户使用。
  2. 使用 pre-release-version 的用户明确知道可能存在的隐患,但将此隐患延续到未来版本的 pre-release-version 不太合理。

当然开发者也可以在选项参数里将includePrerelease设置为true来修改这一行为。

高级范围语法

-区间

连字符表示闭区间。

示例:

  • 1.0.0 - 2.0.0表示>=1.0.0 || <= 2.0.0区间。
  • 1.0.0-beta.0 - 2.0.0表示>=1.0.0-beta.0 || <=2.0.0区间。注意:1.2.4-beta.21.2.5-beta.11.2.6-beta.2不属于此区间。

如果左边的区间只有 partial-version,则剩余的位以0填充。

示例:

  • 1 - 2.0.0表示>=1.0.0 || <=2.0.0区间。
  • 1.1 - 2.0.0表示>=1.1.0 || <=2.0.0区间。

如果右边的区间只有 partial-version,则以 partial-version 为开头的版本都被包括在内,但不能超过 partial-version。

示例:

  • 1.0.0 - 2.0表示>=1.0.0 || <2.1.0区间。
  • 1.0.0 - 2表示>=1.0.0 || <3.0.0区间。

X 区间

Xx*都可以代替major-version.minor-version.patch-version中的一位。

示例:

  • 1.0.x表示>=1.0.0 || <1.1.0区间。
  • 1.x表示>=1.0.0 || <2.0.0区间。
  • x表示>=0.0.0区间。

partial-version 也可以被看作 X 区间。

  • 空字符串表示*区间和>=0.0.0区间。
  • 1表示1.x.x区间和>=1.0.0 || <2.0.0区间。
  • 1.2表示1.2.x区间和>=1.2.0 || <1.3.0区间。

~区间

  • 如果 minor-version 已指定,则允许 patch-version 的递增(包括不变)。
  • 如果 minor-version 未指定,则允许 minor-version 的递增(包括不变)。

示例:

  • ~1.0.0表示>=1.0.0 || <1.1.0区间。
  • ~1.0表示>=1.0.0 || <1.1.0区间。
  • ~1表示>=1.0.0 || <2.0.0区间。
  • ~0表示>=0.0.0 || <1.0.0区间。
  • ~1.2.3-beta.2表示>=1.2.3-beta.2 || <1.3.0区间。注意:1.2.4-beta.21.2.5-beta.11.2.6-beta.2不属于此区间。

^区间

允许递增(包括不变)除major-version.minor-version.patch-version中左起第 1 个非 0 的位之外的任何位。

也就是说,

  1. 允许x.0.0区间的版本更新 minor-version、patch-version
  2. 允许0.x区间的版本更新 patch-version
  3. 不允许0.0.x区间的版本更新

示例:

  • ^1.0.0表示>=1.0.0 || <2.0.0区间。
  • ^0.1.0表示>=0.1.0 || <0.2.0区间。
  • ^0.0.1表示>=0.0.1 || <0.0.2区间。
  • ^1.0.0-beta.0表示>=1.0.0-beta.0 || < 2.0.0区间。注意:1.2.4-beta.21.2.5-beta.11.2.6-beta.2不属于此区间。

许多开发者将0.x中的x当作破坏式变更标识符。

如果左边的区间只有 partial-version,则剩余的位以0填充。

示例:

  • ^0表示^0.0.0区间和>=0.0.0 || <1.0.0区间。
  • ^1表示^1.0.0区间和>=1.0.0 || <2.0.0区间。
  • ^1.1表示^1.1.0区间和>=1.1.0 || <2.0.0区间。

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/04/14/npm%E4%B8%AD%E7%9A%84%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC%E5%8E%9F%E5%88%99/


本文对你有帮助?请支持我


支付宝
微信