npm semver理解以及package-lock.json的探索
文章目录
- semver语义化版本号
- 锁版本机制
- 参考文档
semver语义化版本号
在软件开发中,版本号必不可少,一般而言,版本号都由三位数字构成,比如:
“vue”: “^2.5.2”
其中:
- 2为
主版本号
,一般而言是重大功能更新,或者更新涉及到了api不兼容的情况,比如python2 python3二者不兼容。 - 5为
次版本号
,一般而言针对普通的功能更新,理论上只会有api被depriciated,但可以保证兼容性。 - 2为
补丁版本号
,一般针对bug修复等小的修改与调整
此外,我们还会看到诸如ALPHA, BETA,RELEASE, RC,等等,分别对应如下
- Alpha版:一般实现了功能,但没有完整的测试,可以理解为尝鲜版;
- Beta版:一般是相对于Alpha版本而言比较稳定的版本,但这个版本一般不推荐用于生产环境。
- RC版:Release Candidate,直译过来就是发布版候选者,一般发布之前可能会有很多个候选者版本。
- Release版:发布版,正式版,稳定版。总之生成环境应该使用这个版本。
顺便提一句,我们可能还会遇到比如stable版本,Mainline 版本,Legacy 版本等等
- mainline版本: 可以理解为开发版本,新的功能都会放到这个版本
- stable版本:稳定版,生产环境应使用这个版本
- legacy版本:历史版本,有时候你的环境版本比较低,就需要历史版本
- latest版本:一般是指最新稳定版,有时间我们不关心版本号,只是想使用最新稳定版,就可以指定这个。
- LTS 版本: 长期支持的稳定版,比如操作系统一般会提供这个版本,因为生产环境操作系统不会频繁升级,必须保证可以长期被其维护者维护。
鉴于版本号虽然复杂,但会遵守其约定这一特性,我们可以使用semver的语法来实现软件依赖版本自动升级,而且可以保证兼容性。
semver即sematic versioning的缩写,即语义化版本。即书写的版本号并不是写死的,而是可以按照语义的要求自动更新,语义主要包含:
"node": ">= 8.2.1" // 大于某一版本
"node": "^8.2.1" // 次版本号和补丁版本可自动升级
"node": "~8.2.1" // 补丁版本号可以自动升级 (波浪号)
除了以上的,还包括<=
,表示范围的-
,等等,可以参考官方文档,值得注意的是,版本号的自动变更会发生在以下的几种情况
- 明确指明命令:
npm update
- 在没有
package-lock.json
且还没有下载对应依赖的情况下执行npm install - 存在
package-lock.json
,但在项目中.npmrc
文件中添加了package-lock=false时,安装还没有下载的依赖。
锁版本机制
语义化版本出现的意义,我个人觉得是当项目依赖了某个模块,该模块会后续不断的升级过程提升了性能也保证了兼容,那么理论上我们应该让依赖自动升级。可事实往往并非如此,尤其是api的确未发生变化,但对于某些特定逻辑会出现意想不到的问题。所以有时候为了保证系统稳定性,我们需要做一个选择,是拥抱更高的版本提供的更好的api或者性能来自动升级,还是为了保证系统稳定性不做自动升级。对此,针对于后者,npm提供了package-lock.json的锁版本机制。
事实上npm目前默认只要执行了npm install
就默认会生成一个package-lock.json
文件,可以理解为默认开启了锁版本。所以一般而言你的项目版本号是不会自动升级的。
举个例子:比如现在vue2最新版本是2.6.12。我在本地安装vue@2.6.1。
// node_modules中实际vue版本
"version": "2.6.1"
// package.json的vue语义化版本"dependencies": {"vue": "^2.6.1"}
接下来删除node-modules
之后再进行npm install
,即使使用了语义化版本,下载的最终版本将一直停留在2.6.1
在删除package-lock.json
或者添加.npmrc
,并设置package-lock=false
情况下,执行npm install 之后情况如下
// node_modules中实际vue版本
"version": "2.6.12"
// package.json的vue语义化版本"dependencies": {"vue": "^2.6.1"}
顺便说一句,删除package-lock.json并不是一个好的做法,如果想关闭锁机制,配置.npmrc才是更优雅的做法,这可以让你方便的开启关闭。
我们可以看出,package.json
的版本号在初始安装之后就不会改变,但每次实际安装的版本不锁版本的情况下都是最新的。
如果我们希望更新package.json
文件,可以使用npm update
或者 npm install vue
。后者等同于执行npm install vue@latest
,当然你可以指定具体的版本号。这两个操作相当于是手动升级。
但一般而言推荐使用命令升级而不是手动去修改package.json
中文件的版本号,那样可能会触发bug。
参考文档
nodejs.cn
npm semver理解以及package-lock.json的探索相关推荐
- 一文带你理解Java中Lock的实现原理
转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...
- oracle package lock,Oracle 11g下重现library cache lock等待事件
从下面的例子中可以看到,在生产数据库中对象的重新编译会导致library cache lock,所以应该尽量避免在业务高峰期编译对象.如果是package或过程中存在复杂的依赖关系就极易导致libra ...
- 对JSON的一点认识和理解以及JQuery处理JSON
JSON(JavaScript Object Notation)javscript对象标记,是一种轻量级的数据交换格式.具体的详细基础知识可以参考JSON官网http:/www.json.org/. ...
- MySQL mdl导入_技术分享 | 深入理解 MySQL MDL Lock
作者:高鹏(网名八怪) 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文来源:转载自公众号-mysql cod ...
- Sublime Text 3 离线安装controll package,pretty json, Sublimerge, SqlBeautifier
1.离线安装controll package Click the Preferences > Browse Packages- menu Browse up a folder and then ...
- npm 报错 “Unexpected end of JSON input while parsing near ‘...cGZb4OYe9e+g3wCdPKOuE‘” - node篇
目录 解决方式 使用npm install 时报错 Unexpected end of JSON input while parsing near '...cGZb4OYe9e+g3wCdPKOuE' ...
- NPM Error Unexpected token < in JSON at position 0 while parsing near ‘<!DOCTYP
在 npm login 时,报错 Unexpected token < in JSON at position 0 while parsing near '<!DOCTYPE HTML P ...
- npm:including for package installation – must use TLS 1.2 or higher
看到TLS就明白了,这是让我们设置源为https, so: npm config set registry https://registry.npmjs.org/ 如果默认淘宝源,只是登录和提交,可以 ...
- java json csv_彻底理解使用JavaScript 将Json数据导出CSV文件
前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...
最新文章
- uni-app与Vue的区别
- guns java_guns——一个简便的后台管理系统
- Hadoop:你不得不了解的大数据工具
- 中断请求request_irq
- 电脑显示没有被指定在上运行_可以桌面显示的便条便签怎么弄?有没有电脑桌面上的便条贴...
- 实验3-7 统计学生成绩 (15 分)
- C++17特性一览(转载)
- python cpk计算器_CPK公式
- unity warning CS0108: test4.name' hides inherited memberUnityEngine.Object.name’.
- ar面部识别_【华为P20Pro评测】系统的进化:面部识别、AR该有的都有_华为 P20 Pro_手机评测-中关村在线...
- 隔离式DC-DC转换器:把直流电压转换成高频方波电压,由变压器升压或降压后,再经过整流滤波变为直流电压或者电流。
- 如何理解电容电流超前电压90度
- Callnovo与Freshii合作推出的北美餐饮业颠覆性解决方案-远程真人视频收银员
- Vulkan再探(12):输入附件
- WPS文字给字体添加纹理效果快速改变输入文字的颜色
- 压缩包密码忘记了,如何解压文件?
- “检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005”的解决方法
- 电源php38电路,8脚电源芯片TB6806的电路图
- android并发命令,Android开发实践:基于命令模式的异步任务线程
- 如何为spark的dataframe添加常量列