本文删改自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时,是一个非常宝贵的资源。

转载于:https://www.cnblogs.com/star91/p/npm-bao-de-yu-yi-ban-ben-kong-zhi-semantic-version.html

npm包的语义版本控制(Semantic Versioning of Packages)相关推荐

  1. Semver语义化版本号和npm包之semver的相关使用

    依赖地狱 通俗而言,"依赖地狱"指开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包.随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候 ...

  2. npm包 semver模块【语义化版本号】

    npm包 semver模块 Semver 简介 (Semantic Versioning) Semver 实际案例 ---------------------------------------- 一 ...

  3. 语义版本号(Semantic Versioning)

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

  4. Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包

    Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 23 使用 npm 的语义版本控制 24 ...

  5. npm(四):剖析npm包版本管理机制

    Nodejs成功离不开 npm 优秀的依赖管理系统.在介绍整个依赖系统之前,必须要了解 npm如何管理依赖包的版本,本章将介绍 npm包 的版本发布规范.如何管理各种依赖包的版本以及一些关于包版本的最 ...

  6. 规范升级 NPM 包

    规范升级 NPM 包 前言 在日常工作中,当组件跨项目使用时,我们往往会选择把组件抽成 npm 包.那么在 npm 开发以及发布的过程中有什么需要注意的事项吗?本文将从我自己的角度,来为大家介绍一下我 ...

  7. npm收录了哪些包_手把手教你制作一个小而美丽的 npm 包并发布

    第1步:npm账户 你需要一个 npm 账户,如果米有,注册地址是:npmjs.com/signup 第2步:登录 进入你自己电脑的终端(cmd)并输入: npm adduser 也可以使用以下命令: ...

  8. Node.js 模块以及npm包的管理和使用

    Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...

  9. 聊一聊工作中如何优雅的通过TDD方式来维护一个高质量的NPM包

    背景 最近一直在采用TDD(测试驱动开发)的方式来维护公司内部的一套通用业务逻辑. 既然是应用到公司实际项目中的,那就不能随随便便搭个脚手架来完成了. 调研过程中,发现TypeScript libra ...

最新文章

  1. iOS下JS与OC互相调用(二)--WKWebView 拦截URL
  2. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
  3. halcon 形状匹配
  4. pytorch 批量筛选
  5. Apache-Flink深度解析-DataStream-Connectors之Kafka
  6. 深入剖析Android音频(二)AudioSystem
  7. 《游戏设计艺术(第二版)》第十章个人学习
  8. 指纹识别 python实现_Python实现指纹识别你见过没?
  9. mybatisplus自动生成id_【mybatis-plus】主键id生成、字段自动填充
  10. 海康威视-海康门禁设备对接SDK-已完成完整封装调用
  11. 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台
  12. 目光远大,不要被小许诺所牵绊,唯有自我提升是真理
  13. ipv6头部格式 c语言,2.2.1 IPv6和IPv4基本头部格式
  14. 验证input和textarea的输入是否有效,也就是不为空,也不都是空格
  15. PPT基础(十五)调整形状的透明度
  16. 英语----我们快乐生活的一部分
  17. Moment函数上周/上月/今年/去年等时间开始和结束数组
  18. 邵阳一中2021高考成绩查询,2021年邵阳高考状元名单公布,邵阳文理科状元是谁多少分...
  19. OpenStack全网最全部署教程
  20. 点开,看一段,你就会喜欢上学习pandas,你该这么学!No.3

热门文章

  1. 在DC中误删除ISA计算机后无法连接ISA配置服务器问题
  2. Spring的定时任务
  3. Android用ImageView显示本地和网上的图片
  4. delphi webbrowser 经常使用的演示样本
  5. clone方法是如何工作的
  6. TurboMail邮件服务器 V4.2.0 正式发布
  7. LeetCode 994. 腐烂的橘子
  8. Python PIL库处理图片常用操作,图像识别数据增强的方法
  9. C++学习笔记(11) 重载流插入运算符和流提取运算符,以及自动类型转换
  10. 开机启动项_开机时出现“checking media presence”