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)规范格式