文章目录

  • 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" // 补丁版本号可以自动升级 (波浪号)

除了以上的,还包括<=,表示范围的-,等等,可以参考官方文档,值得注意的是,版本号的自动变更会发生在以下的几种情况

  1. 明确指明命令:npm update
  2. 在没有package-lock.json且还没有下载对应依赖的情况下执行npm install
  3. 存在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的探索相关推荐

  1. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  2. oracle package lock,Oracle 11g下重现library cache lock等待事件

    从下面的例子中可以看到,在生产数据库中对象的重新编译会导致library cache lock,所以应该尽量避免在业务高峰期编译对象.如果是package或过程中存在复杂的依赖关系就极易导致libra ...

  3. 对JSON的一点认识和理解以及JQuery处理JSON

    JSON(JavaScript Object Notation)javscript对象标记,是一种轻量级的数据交换格式.具体的详细基础知识可以参考JSON官网http:/www.json.org/. ...

  4. MySQL mdl导入_技术分享 | 深入理解 MySQL MDL Lock

    作者:高鹏(网名八怪) 文章末尾有他著作的<深入理解 MySQL 主从原理 32 讲>,深入透彻理解 MySQL 主从,GTID 相关技术知识. 本文来源:转载自公众号-mysql cod ...

  5. Sublime Text 3 离线安装controll package,pretty json, Sublimerge, SqlBeautifier

    1.离线安装controll package Click the Preferences > Browse Packages- menu Browse up a folder and then ...

  6. npm 报错 “Unexpected end of JSON input while parsing near ‘...cGZb4OYe9e+g3wCdPKOuE‘” - node篇

    目录 解决方式 使用npm install 时报错 Unexpected end of JSON input while parsing near '...cGZb4OYe9e+g3wCdPKOuE' ...

  7. 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 ...

  8. npm:including for package installation – must use TLS 1.2 or higher

    看到TLS就明白了,这是让我们设置源为https, so: npm config set registry https://registry.npmjs.org/ 如果默认淘宝源,只是登录和提交,可以 ...

  9. java json csv_彻底理解使用JavaScript 将Json数据导出CSV文件

    前言 将数据报表导出,是web数据报告展示常用的附带功能.通常这种功能都是用后端开发人员编写的.今天我们主要讲的是直接通过前端js将数据导出Excel的CSV格式的文件. 原理 首先在本地用Excel ...

最新文章

  1. uni-app与Vue的区别
  2. guns java_guns——一个简便的后台管理系统
  3. Hadoop:你不得不了解的大数据工具
  4. 中断请求request_irq
  5. 电脑显示没有被指定在上运行_可以桌面显示的便条便签怎么弄?有没有电脑桌面上的便条贴...
  6. 实验3-7 统计学生成绩 (15 分)
  7. C++17特性一览(转载)
  8. python cpk计算器_CPK公式
  9. unity warning CS0108: test4.name' hides inherited memberUnityEngine.Object.name’.
  10. ar面部识别_【华为P20Pro评测】系统的进化:面部识别、AR该有的都有_华为 P20 Pro_手机评测-中关村在线...
  11. 隔离式DC-DC转换器:把直流电压转换成高频方波电压,由变压器升压或降压后,再经过整流滤波变为直流电压或者电流。
  12. 如何理解电容电流超前电压90度
  13. Callnovo与Freshii合作推出的北美餐饮业颠覆性解决方案-远程真人视频收银员
  14. Vulkan再探(12):输入附件
  15. WPS文字给字体添加纹理效果快速改变输入文字的颜色
  16. 压缩包密码忘记了,如何解压文件?
  17. “检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005”的解决方法
  18. 电源php38电路,8脚电源芯片TB6806的电路图
  19. android并发命令,Android开发实践:基于命令模式的异步任务线程
  20. 如何为spark的dataframe添加常量列

热门文章

  1. JQuery在线引用地址整理
  2. [丁奇四十五讲]第9讲学习笔记
  3. GitLab-CE 下载安装及使用
  4. 邮件营销放大招:简单视频邮件创造新惊喜!
  5. 我做的泡泡龙小游戏——总结
  6. x1 carbon 扩展屏 模糊
  7. upload-labs通关记录
  8. 配置计算机硬件,电脑硬件配置有哪些
  9. python三维数组可视化_【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)...
  10. 利用:before和:after伪类制作类似微信对话框