Semver (Semantic Versioning) 语义化版本号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Semver (Semantic Versioning) 语义化版本号相关的知识,希望对你有一定的参考价值。

参考技术A

首先,我们来看看 react 最近 6 个月的版本发布记录,截图来自 npmjs.com :

从上图,我们不难得出几个结论:

在早期,开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包。随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候可能面临版本控制被锁死的风险。这就是「依赖地狱」的问题。

因此,Github 起草了一个具有指导意义的,统一的版本号表示规则,称为 Semantic Versioning(语义化版本),即 Semver。目前它是由 npm 的团队维护。

Semver 的出现,规定了版本号如何表示,如何增加,如何进行比较,不同的版本号意味着什么。遵从了 Semver 规范的包依赖会非常清晰,不会出现循环依赖、依赖冲突等常见问题。

关于 Semver 的完整规则可以查阅 Semver官网 。

下面提炼几个比较关键的要点。

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

先行版本号及版本编译信息可以加到「主版本号.次版本号.修订号」的后面,作为延伸。

当要发布 大版本 或者 核心的 Feature 时,但是又不能保证这个版本的功能 100% 正常。这个时候就需要通过发布 先行版本

比较常见的先行版本包括:内测版、灰度版本和 RC 版本。Semver 规范中使用 alpha、beta、rc(以前叫做 gama)来修饰即将要发布的版本。它们的含义是:

比如:1.0.0-alpha.0,1.0.0-alpha.1,1.0.0-beta.0,1.0.0-rc.0,1.0.p-rc.1 等版本。alpha,beta,rc 后需要带上次数信息。

最后,当经过这些先行版本的一系列测试之后,终归会有一个正式版本,是最终交付用户使用的一个版本,也就是 Release 版。

列举出比较实用的一些规则:

在 npm 的依赖的规则中,还有 ~ 、 > 、 < 、 = 、 >= 、 <= 、 - 、 || 、 x 、 X 、 * 等符号。

当执行 npm install xxx -S 来安装三方包时,npm 会首先安装包的最新版本,然后将包名及版本号写入到 package.json 文件中。被安装的依赖的版本号前会默认加上 ^ 符号。

比如,通过 npm 安装 vue 时:

通常我们发布一个包到npm仓库时,我们的做法是先修改 package.json 为某个版本,然后执行 npm publish 命令。手动修改版本号的做法建立在你对 Semver 规范特别熟悉的基础之上,否则可能会造成版本混乱。npm 考虑到了这点,它提供了相关的命令来让我们更好的遵从 Semver 规范:

当执行 npm publish 时,会首先将当前版本发布到 npm registry,然后更新 dist-tags.latest 的值为新版本。

当执行 npm publish --tag=next 时,会首先将当前版本发布到 npm registry,并且更新 dist-tags.next 的值为新版本。这里的 next 可以是任意有意义的命名(比如:v1.x、v2.x 等等)

OK,接下来用户就可以通过 npm install package@next 来指定安装 next 版本的依赖了。

在 npm install 后,会生成一个 package-lock.json 文件用于保存当前安装依赖的各种来源及版本号。

在 npm 5.4.2 版本后,package-lock.json 的变动规则:

如果高于 package-lock.json 中对应的 dependency 的 version 时,会安装当前范围版本号中最高的版本,会更新 package-lock.json 文件中对应的版本号。

重新安装后 npm 找不到模块“semver”

【中文标题】重新安装后 npm 找不到模块“semver”【英文标题】:npm cannot find module 'semver' after reinstall 【发布时间】:2020-01-17 08:34:30 【问题描述】:

我使用的是 ubuntu 19.04。

尝试使用 npm 执行任何操作时出现以下错误

internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module 'semver'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/usr/share/npm/lib/utils/unsupported.js:2:14)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

我曾尝试从 SO 应用不同的解决方案,但不幸的是它们没有奏效。

它在重新安装 NPM 后开始发生,因为一些错误我很遗憾无法重新创建。

我尝试过的

sudo apt purge nodejs
sudo apt autoremove

在这两个步骤之后,npm 被卸载。

npm -v
bash: /usr/bin/npm: No such file or directory

我继续

sudo apt install nodejs

但是,即使在我清除了文件之后,错误也会发生

User@User:/$ node -v
v10.16.3
User@User:/$ npm -v
internal/modules/cjs/loader.js:638
    throw err;
    ^

Error: Cannot find module 'semver'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
    at Function.Module._load (internal/modules/cjs/loader.js:562:25)
    at Module.require (internal/modules/cjs/loader.js:692:17)
    at require (internal/modules/cjs/helpers.js:25:18)
    at Object.<anonymous> (/usr/share/npm/lib/utils/unsupported.js:2:14)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

我也试过了

sudo apt purge npm
sudo apt purge nodejs
sudo apt autoremove
sudo apt install npm
sudo apt install nodejs
sudo rm -rf /usr/local/lib/node_modules
sudo rm -rf ~/.npm
brew uninstall --force node
brew install node

它仍然会产生相同的错误。应该使用这两种方法卸载全局文件。

为了确定我已经搜索了计算机并删除了任何看起来与 node 或 npm 相关的内容。

sudo find / -type f -name "node"
sudo find / -type f -name "node_modules"
sudo find / -type f -name "npm"

如果通过清除进行了某些操作,可能是某些与 NPM 的文件通信产生了错误。

【问题讨论】:

【参考方案1】:

试试

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
apt-get update
apt-get install nodejs

您可能还想在这里查看答案:Npm install cannot find module 'semver'

【讨论】:

答案不止一个,不是吗?最近我也遇到了同样的问题,我通过上面提到的命令直接安装解决了这个问题。我提到的帖子显示了安装 npm 的替代方法,这就是我所指的。【参考方案2】:

我遇到了类似的问题,重新安装对我有用。这种直截了当的方法对我来说很好。成立here

首先,移除老员工

sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* ~/.npm
sudo rm -rf /usr/local/lib/node*
sudo rm -rf /usr/local/bin/node*
sudo rm -rf /usr/local/include/node*

sudo apt-get purge nodejs npm
sudo apt autoremove

然后,从official site下载最新的 tar.xz NodeJS 文件

tar -xf node-v#.#.#-linux-x64.tar.xz
sudo mv node-v#.#.#-linux-x64/bin/* /usr/local/bin/
sudo mv node-v#.#.#-linux-x64/lib/node_modules/ /usr/local/lib/

#.#.# 是您下载的版本。

最后,使用验证安装

node -v
npm -v

【讨论】:

谢谢!成功了!

以上是关于Semver (Semantic Versioning) 语义化版本号的主要内容,如果未能解决你的问题,请参考以下文章

Semver (Semantic Versioning) 语义化版本号

webpack配置篇(三十八):语义化版本(Semantic Versioning)规范格式

npm 中的 4 位版本控制

语义版本控制 (Semver) - 如何对向后兼容的大型功能更新进行 semver

简化 semver 版本比较逻辑

semver:匹配预发布后缀 (3.* =/= 3.4.5-1)