我们先说下,npm版本号定义
版本格式:X.Y.Z[-string]其含义为:
X:主版本号
Y:次版本号
Z:修正版本号
string: 先行版本号或版本编译信息
举个例子:
6.3.2-alpha的含义为:
主版本号6,有6次不可向下兼容的更新迭代。
次版本号3,有3次小的功能迭代。6.*.* <=6.3.2的依赖声明,都可以安装此新包。
修正版本号2,有2次bug修改或其他非重大功能的修改。6.*.* <=6.3.2的依赖声明,都可以安装此新包。
先行版本号alpha,表示处理试验阶段。
扩展阅读:语义化版本 2.0.0
package.json怎么识别依赖版本
现在我们看看具体的代码:
"vue": "~2.5.22", "vue-class-component": "^6.0.0", "vue-router": "3.0.1", "express": "latest", "mongoose": "*",
符号^:锁定主版本,可更新次版本号、修正版本号和先行版本号
例如"vue-class-component": "^6.0.0",安装依赖时,可以安装符合6.*.* 的任意版本,只要主版本号是6即可。
符号~:锁定主版本号和次版本号,可更新修正版本号和先行版本号
例如"vue": "~2.5.22",安装依赖时,可以安装符合2.5.*的任意版本。
空符号:锁定所有版本号
例如"vue-router": "3.0.1",只能安装版本为3.0.1的依赖包。
符号*:定义某个版本号范围
例如vue-router": "3.0.*",可以安装3.0固定的任意版本,比如3.0.1、3.0.2。
latest:安装最新的稳定版本
例如"express": "latest",可以安装4.18.1 (2022.06.13最新版本)。
*:安装最新发布的版本,不一定是稳定版本
例如"mongoose": "*",可以安装6.0.0-rc2、3.9.7等。
Git URL:使用Git上发布的包
引用格式: <protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
"test": "git+ssh://git@github.com:npm/cli.git#v1.0.27"
扩展阅读:npm docs - dependencies
在这里要提醒下,请千万不必相信npm包的版本号,这样说就是血泪教训啊。
我们知道笔者在使用system.js时,使用的版本限制是:system.js: "^6.3.2"。
在安装依赖的时候,意外安装了> 6.3.2的版本,导致项目运行出错。
原因就是system.js作者,没有按照semver规范,进行版本号命名,导致笔者的项目,引入了不可向下兼容的更新,进而使项目运行出错。
dependencies、devDependencies与peerDependencies
dependencies
生产环境中使用到的依赖,统一安装在dependencies下。
举个例子:
"dependencies": { "chalk": "^2.4.2", "commander": "^3.0.0", "fs-extra": "^8.1.0", "inquirer": "^6.5.0", "mem-fs": "^1.1.3", "mem-fs-editor": "^6.0.0", "shelljs": "^0.8.3" }
在上面代码中,可以看到笔者做的cli工具包的package.json中的片段。
shelljs用于操作文件,如果改在devDependencies声明,则用户安装当前工具包后,运行会报错。
因为devDependencies字段声明的依赖,在npm install 工具包时,是不会安装的。
必须在dependencies字段中声明,才会被安装。
devDependencies
生产环境不需要使用的依赖,都需要安装在peerDependencies下。
因为生产环境下,是不会安装devDependencies字段下的依赖的。
现在看看:
"devDependencies": { "@commitlint/cli": "^8.1.0", "@commitlint/config-conventional": "^8.1.0", "commitizen": "^4.0.3", "commitlint-config-cz": "^0.12.1", "cz-customizable": "^6.2.0", "standard-version": "^7.0.0" }
上述代码,是笔者做的cli工具包的package.json中的片段。
commitizen是笔者用于规范Git提交规范的依赖包,只在开发环境中使用,所以在devDependencies中声明。
peerDependencies
当开发一些插件和工具包时,对使用方的运行环境的依赖包版本有要求,可以使用peerDependencies字段进行声明。
举个例子:
{ "name": "tea-latte", "version": "1.3.5", "peerDependencies": { "tea": "2.x" } }
当前工具tea-latte,依赖tea包。而且,要求tea包是主版本2。
当不满足要求时,控制台会进行报错处理。
注意
npm v7版本, peerDependencies会默认安装。
npm v3 到 npm v6版本,peerDependencies不会自动安装。
参考
npm Docs
语义化版本 2.0.0
本文关于package.json管理依赖包版本的详解已讲述完毕,欢迎大家关注更多后续精彩内容。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/128815.html
摘要:本人菜鸟一枚,一直也没理解这个,不过看到了就记录一下吧,万一哪天用到了,说不准就懂了或参数的意思是精确的安装指定版本的模块,细心的同学会发现字段里每个模块版本号前面的不见鸟。。。 NPM命令详解平时工作中经常用npm安装,每次用的时候有些命令都要去查一次,这次就自己把这些命令整理下,让自己可以多记住一些。对于还不知道NPM是什么的同学请自行google吧 这里我就不多BB了,主要记录...
摘要:基础的端到端的基准测试显示大约比快八倍。所谓单线程,就是指一次只能完成一件任务。在服务器端,异步模式甚至是唯一的模式,因为执行环境是单线程的,如果允许同步执行所有请求,服务器性能会急剧下降,很快就会失去响应。 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 e...
摘要:内容结构是中列出的每个依赖项的大型列表,应安装的特定版本,模块的位置,验证模块完整性的哈希,它需要的包列表,以及依赖项列表。期望与真实行为之间的这种冲突在中引发了一个非常有趣的问题线索。此更改是作为的一部分发布的,该版本于年月日上线。 showImg(https://segmentfault.com/img/bVbkuXN?w=1440&h=1080); 想阅读更多优质文章请猛戳Git...
摘要:深入浅出一直想致力于写一篇关于广义讲解系统的文章,苦于时间有限,资源有限。事件驱动机制是通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文的切换。 深入浅出Node.js 一直想致力于写一篇关于广义讲解Node.js系统的文章,苦于时间有限,资源有限。这篇文章是在结合自己的学习心得以及与行业大佬共同探讨下争对于熟练掌握JS语言后的广义Node.js.至于为什么...
摘要:深入浅出一直想致力于写一篇关于广义讲解系统的文章,苦于时间有限,资源有限。事件驱动机制是通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文的切换。 深入浅出Node.js 一直想致力于写一篇关于广义讲解Node.js系统的文章,苦于时间有限,资源有限。这篇文章是在结合自己的学习心得以及与行业大佬共同探讨下争对于熟练掌握JS语言后的广义Node.js.至于为什么...
阅读 547·2023-03-27 18:33
阅读 731·2023-03-26 17:27
阅读 630·2023-03-26 17:14
阅读 591·2023-03-17 21:13
阅读 519·2023-03-17 08:28
阅读 1800·2023-02-27 22:32
阅读 1292·2023-02-27 22:27
阅读 2177·2023-01-20 08:28