npm包的语义版本控制(Semantic Versioning of Packages)
本文删改自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.2
、0.0.3
等每个版本中进行突变更改。 同样的情况也可能存在于从0.1.0
到0.2.0
到0.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)相关推荐
- Semver语义化版本号和npm包之semver的相关使用
依赖地狱 通俗而言,"依赖地狱"指开发者安装某个软件包时,发现这个软件包里又依赖不同特定版本的其它软件包.随着系统功能越来越复杂,依赖的软件包越来越多,依赖关系也越来越深,这个时候 ...
- npm包 semver模块【语义化版本号】
npm包 semver模块 Semver 简介 (Semantic Versioning) Semver 实际案例 ---------------------------------------- 一 ...
- 语义版本号(Semantic Versioning)
版本号格式不陌生吧,.NET 传统的版本号格式类似这样 1.5.1254.0.本文将推荐一种新的版本号格式--语义版本号,格式类似这样 1.4.6-beta.我推荐语义版本号是因为这样的版本号自包含语 ...
- Node.js 入门教程 23 使用 npm 的语义版本控制 24 卸载 npm 软件包 25 npm 全局或本地的软件包
Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录 Node.js 入门教程 23 使用 npm 的语义版本控制 24 ...
- npm(四):剖析npm包版本管理机制
Nodejs成功离不开 npm 优秀的依赖管理系统.在介绍整个依赖系统之前,必须要了解 npm如何管理依赖包的版本,本章将介绍 npm包 的版本发布规范.如何管理各种依赖包的版本以及一些关于包版本的最 ...
- 规范升级 NPM 包
规范升级 NPM 包 前言 在日常工作中,当组件跨项目使用时,我们往往会选择把组件抽成 npm 包.那么在 npm 开发以及发布的过程中有什么需要注意的事项吗?本文将从我自己的角度,来为大家介绍一下我 ...
- npm收录了哪些包_手把手教你制作一个小而美丽的 npm 包并发布
第1步:npm账户 你需要一个 npm 账户,如果米有,注册地址是:npmjs.com/signup 第2步:登录 进入你自己电脑的终端(cmd)并输入: npm adduser 也可以使用以下命令: ...
- Node.js 模块以及npm包的管理和使用
Node.js模块系统 Node.js的模块系统是将可重用代码封装在各种模块中,减少了应用程序的代码量,模块系统提高了开发效率和代码的可读性,并且模块打包代码的方式不会改变全局作用域,开发人员可以在被 ...
- 聊一聊工作中如何优雅的通过TDD方式来维护一个高质量的NPM包
背景 最近一直在采用TDD(测试驱动开发)的方式来维护公司内部的一套通用业务逻辑. 既然是应用到公司实际项目中的,那就不能随随便便搭个脚手架来完成了. 调研过程中,发现TypeScript libra ...
最新文章
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
- halcon 形状匹配
- pytorch 批量筛选
- Apache-Flink深度解析-DataStream-Connectors之Kafka
- 深入剖析Android音频(二)AudioSystem
- 《游戏设计艺术(第二版)》第十章个人学习
- 指纹识别 python实现_Python实现指纹识别你见过没?
- mybatisplus自动生成id_【mybatis-plus】主键id生成、字段自动填充
- 海康威视-海康门禁设备对接SDK-已完成完整封装调用
- 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台
- 目光远大,不要被小许诺所牵绊,唯有自我提升是真理
- ipv6头部格式 c语言,2.2.1 IPv6和IPv4基本头部格式
- 验证input和textarea的输入是否有效,也就是不为空,也不都是空格
- PPT基础(十五)调整形状的透明度
- 英语----我们快乐生活的一部分
- Moment函数上周/上月/今年/去年等时间开始和结束数组
- 邵阳一中2021高考成绩查询,2021年邵阳高考状元名单公布,邵阳文理科状元是谁多少分...
- OpenStack全网最全部署教程
- 点开,看一段,你就会喜欢上学习pandas,你该这么学!No.3
热门文章
- 在DC中误删除ISA计算机后无法连接ISA配置服务器问题
- Spring的定时任务
- Android用ImageView显示本地和网上的图片
- delphi webbrowser 经常使用的演示样本
- clone方法是如何工作的
- TurboMail邮件服务器 V4.2.0 正式发布
- LeetCode 994. 腐烂的橘子
- Python PIL库处理图片常用操作,图像识别数据增强的方法
- C++学习笔记(11) 重载流插入运算符和流提取运算符,以及自动类型转换
- 开机启动项_开机时出现“checking media presence”