本文删改自Node.js 8 the Right Way Part I Chapter 3

npm 使用语义版本控制(SemVer)来寻找包的最佳可用兼容版本。

以安装测试框架mocha为例

$ ​​npm​​ ​​install​​ ​​--save-dev​​ ​​--save-exact​​ ​​mocha@3.4.2​

-- save-exact (或-e)标志告诉 npm 我们希望指定特定的包版本,在本例中是3.4.2。
在 Node.js 社区中,语义版本控制是一个强有力的约定惯例,在设置软件包的版本号时,一定要遵循这个惯例。 版本号由点连接的三个部分组成: 主版本、次版本和补丁。

为了遵守语义版本约定,当你修改你的代码时,你必须递增版本号的正确部分:

  • 如果您的代码更改没有引入或删除任何功能(如 bug 修复) ,那么只需增加补丁版本即可。
  • 如果您的代码引入了新的功能,但是没有删除或更改现有的功能,那么增加次要版本并重置补丁版本号。
  • 如果您的代码以任何方式破坏了现有的功能,那么增加主版本并重置次要版本和补丁版本。

如果希望 npm 调用最匹配的版本,可以省略 -- save-exact 标志。 甚至可以在运行 npm install 时完全省略版本号,在这种情况下,npm 将下拉最新发布的版本。

如果通过 npm 安装模块时省略 -- save-exact 标志,则版本号将附加一个 caret (^)到 package.json 中。 例如,"^3.4.2"而不是"3.4.2"。 插入符号意味着 npm 将使用大于或等于您指定的最新次要版本。

例如,如果您的依赖项版本设置为 ^1.5.7,并且模块作者在1.6.0版本中发布了一个新的次要版本,那么任何安装您的模块的人都会安装1.6.0版本的依赖项。即使依赖项发布了高于2.0的版本,npm 不会选择2.0版本,因为主版本被认为是向后不兼容的。

只要每个人都遵守语义版本约定,那么一切都很美好,因为次要版本只能添加新功能,而不会破坏现有的功能。 实际上,总有一些包的作者没有遵守这个约定。如果您希望有一些回旋余地,但仍然要稍微严格一些,那么可以使用波浪号(~)前缀字符代替。 继续以前面的例子说明,如果您的依赖项设置为 ~1.5.7,而作者发布了1.5.8,那么您的用户将得到1.5.8,但不会自动升级到1.6.0。 使用 ~ 作为前缀比使用 ^ 要安全一些,因为人们不太可能在补丁发布中引入突破性的改变。

虽然语义版本已经被社区广泛采用,但是作者有时会在主版本达到1之前对次版本和补丁版本进行破坏性的更改。 例如,一个项目可能从0.0.1版本开始,然后在0.0.20.0.3等每个版本中进行突变更改。 同样的情况也可能存在于从0.1.00.2.00.3.0的项目,等等。为了应对这个问题,当遇到(^)和(~)前缀的版本号时,npm 会忽略了前导零。

我的建议是: 在安装软件包时始终使用 -- save-exact。 缺点是您必须显式地更新您所依赖的包的版本号以选择更新的版本。 但是至少你可以用你自己的方式来处理这个问题,而不是由于你不能控制的上游依赖而引起意外的破坏。

这里我还有一个关于版本号的小贴士。即使您小心翼翼地管理您的直接依赖关系-- save-exact,这些依赖项在自己的依赖关系中可能不会那么严格。 这就是为什么package-lock.json如此重要。它可以固化整个依赖关系树的版本,包括校验和。

如果您真的希望每次安装具有相同的文件,那么您应该提交package-lock.json到版本控制系统。 当您准备执行更新时,使用npm outdated命令来获得一个报告,显示您所依赖的模块中哪些模块具有更新版本。然后,当您安装模块的最新版本时,package-lock.json 中会生成最新的版本依赖树。

通过提交package-lock.json。可以在开发项目时,创建一个审计跟踪,允许您从过去的任何点运行完全相同的代码堆栈。在尝试追踪 代码中或者依赖包中的bug时,是一个非常宝贵的资源。

npm包的语义版本控制(Semantic Versioning of Packages)的更多相关文章

  1. npm包使用语义化版本号

    npm 采用语义版本管理软件包.所谓语义版本,就是指版本号为a.b.c的形式,其中a是大版本号,b是小版本号,c是补丁号. 一个软件发布的时候,默认就是1.0.0版.如果以后发布补丁,就增加最后一位数 ...

  2. 使用 GitVersion 在编译或持续构建时自动使用语义版本号(Semantic Versioning)

    我们在之前谈过 语义版本号(Semantic Versioning),在项目中应用语义版本号能够帮助库的开发者在发布包时表明更多的语义信息.这是趋势,从微软的博客 Versioning NuGet p ...

  3. 语义版本号(Semantic Versioning)

    版本号格式不陌生吧,.NET 传统的版本号格式类似这样 1.5.1254.0.本文将推荐一种新的版本号格式——语义版本号,格式类似这样 1.4.6-beta.我推荐语义版本号是因为这样的版本号自包含语 ...

  4. Semantic Versioning Specification & 语义化版本

    Semantic Versioning Specification & 语义化版本 Semantic Versioning Specification http://semver.org 16 ...

  5. 记一次发布/更新npm包的过程及包版本管理

    您可以发布包含package.json文件的任何目录.这里如何首次发布程序包以及如何在以后更新程序包. 如何发布包 制备 了解npm政策 在开始之前,如果您对网站礼仪,命名,许可或其他指南有疑问,最好 ...

  6. node.js零基础详细教程(3):npm包管理、git github的使用

    第三章  建议学习时间4小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑 ...

  7. npm包的更新说明,你还敢不看吗

    npm包的更新说明,你还敢不看吗 前言 平时工作少不了依赖一些第三方的npm包,站在各位大牛的肩膀上来更好的写bug,此外还可以学习各位大佬们的各种设计思路和优雅实现.不过npm包虽好,但使用之前也要 ...

  8. 不会发布npm包?进来看看?

    前言 npm(Node Package Manager),一个Node的包管理器,平时我们常用的公共模块(插件)或者叫做包大多都放在上面,所以接下来要封装的插件,我们就简单称它为npm包,本文从就从这 ...

  9. npm包与gem包--在线&离线安装

    目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...

随机推荐

  1. 常用Maven插件介绍(转载)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  2. 解决Mac外接显示器字体模糊的问题

    Mac外接显示器时,除非接的是Apple自家的显示器“ACD”,不然一般会遇到字体模糊发虚的问题.在终端中执行命令: defaults -currentHost write -globalDomain ...

  3. SpringBoot-设置定时任务

    @Scheduled为设置定时任务的注解. 参数常用的为两种: 第一种是fixedRate,表示以一种固定频率去执行,单位为毫秒:例如@Scheduled(fixedRate = 5000)  表示为 ...

  4. 嘉立创制作PCB流程

    现在做板子基本上是选择嘉立创和捷配,今天看一下嘉立创如何下PCB和STM贴片单,改天再写一下捷配的下单 我喜欢用下单助手,比较方便 注意需要把自己的板子的PCB文件用压缩软件生成压缩包文件,名字自己取 ...

  5. GoCN每日新闻(2019-10-26)

    GoCN每日新闻(2019-10-26) 1. GateKeeper:滴滴开源的使用Go编写的不依赖分布式数据库的API网关 https://mp.weixin.qq.com/s/gpQSPJ-uRp ...

  6. ICEM-带孔小板

    原版视频下载地址:https://pan.baidu.com/s/1jHMvXHG 密码: p93q

  7. (未完成)catalyst-system WriteUp(2019暑假CTF第一周reverse)

    目录 预备学习--Linux实践:ELF文件格式分析 一.概述 二.分析ELF文件头(ELF header) 三.通过文件头找到section header table,理解其内容 四.通过secti ...

  8. Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本

    本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品. 该思路可运 ...

  9. Real-time ‘Actor-Critic’ Tracking

    Real-time ‘Actor-Critic’ Tracking 2019-07-15 10:49:16 Paper: http://openaccess.thecvf.com/content_EC ...

  10. Spring Boot-IntelliJ IDEA搭建SpringBoot

    点击create new project 点击next 这里基本都已经自动生成了,简单介绍下: Name:项目名称 Type:我们是Maven构建的,那么选择第一个Maven Project Pack ...