npm 重新安装依赖_npm-shrinkwrap锁定依赖

news/2024/7/3 2:33:45

c974c5591659aa126cc3d020bd01541c.png

写在前面

npm采用语义化的版本号 semver 进行控制,让开发过程中依赖的获取和升级变得非常容易,但不严格的版本号控制,也带来了不确定性~~
  • npm 建议使用semver版本,部分包不遵循semver;
  • package.json 可以使用精确的版本号控制你的直接依赖包,但第三方依赖的包无法管理;
  • 在开发阶段执行得到的版本,和后续部署时得到的可能是不一致的,更不可控的是,你依赖的第三方包也有这样的情况会导致潜在的上线风险。

目前主流的版本控制使用的是 semver 语义化版本。即,X.Y.Z (主版本号.次版本号.修订号)

  • 主版本号:当你做了不兼容的 API 修改
  • 次版本号:当你做了向下兼容的功能性新增
  • 修订号:当你做了向下兼容的问题修正

也可以将先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。(v1.2.2-beta)

# 查看当前哪些包需要更新
$ npm outdated -g -depth=0

b631626c4ed46503d673eaa7bdf3a0ff.png

安装依赖

npm install 会生成 package.json,以及 node_modules (依赖树)。

同一套 package.json 生成相同的 node_modules 吗?实际情况并非如此!
  • 不同的npm版本,安装算法可能存在差异;
  • 依赖包发布了新 semver-range 版本;
  • 某个依赖项的依赖发布了新版本,且其使用 ^1.2.3 方式,即使你的项目中制定了固定版本;
  • 安装的版本不在可用,或出现版本变异。

锁定依赖

默认情况下,当用 --save/-S 或者 --save-dev/-D 安装一个模块时,npm 通过脱字符(^)来限定所安装模块的主版本号。

方式一:prefix控制

23d2471edd615d5cb5db2cc3261ced1a.png

所以,我们可以将需要安装的模块版本前缀默认设置成波浪号(~);对于那些偏执的认为任何更新(模块的行为)会破坏系统的人,可以配置npm仅安装精确版本号的模块。

方式二:shrinkwrap

另一个选择是,可以在项目中使用 shrinkwrap,在开发阶段依赖稳定后,运行如下命令:

npm shrinkwrap
npm shrinkwrap--dev # 将dev-dependencies计算在内

这会生成一个 shrinkwrap.json 文件,该文件包含了你正在使用的模块的指定版本。当运行 npm install时,该文件所指定的模块版本会覆盖 package.json 文件中所指定的版本。

注意问题:

  • shrinkwrap计算时是根据当前依赖安装的目录结构生成的,如果你不能保证package.json文件定义的依赖与node_modules下已安装的依赖是匹配、无冗余的,建议在执行shrinkwrap命令前清理依赖并重新安装(rm -rf node_modules && npm install)或精简依赖(npm prune)
  • 默认情况下,shrinkwrap只计算dependencies依赖,而不计算dev-dependencies,如果在生产环境也需要开发依赖或你的依赖分类不清晰,使用--dev参数生成shrinkwrap文件确保不会出问题。
增加、更新、删除包的步骤如下:第一步: 安装指定版本包 npm install/uninstall package_name@version --save第二步: 测试功能,功能正常后,执行 npm shrinkwrap 把依赖写入 shrinkwrap 文件;第三步: 在代码库中提交 shrinkwrap / package.json 描述。

版本控制

package-lock.json

对于 node_modules 或 package.json 的任何修改,都会自动生成 package-lock.json。它描述了生成的确切树,以便后续安装能够生成相同的树,而不管中间依赖性更新

shrinkwrap.json

为防止出现这种潜在问题,npm使用 package-lock.jsonnpm-shrinkwrap.json(如果存在)。这些文件称为包锁或锁文件。

{"name": "A","version": "0.1.0",...metadata fields..."dependencies": {"B": {"version": "0.0.1","resolved": "https://registry.npmjs.org/B/-/B-0.0.1.tgz","integrity": "sha512-DeAdb33F+""dependencies": {"C": {"version": "git://github.com/org/C.git#5c380ae319fc4efe9e7f2d9c78b0faa588fd99b4"}}}}
}

该文件描述了一个精确的、可重现的 node_modules 树。一旦它出现,任何未来的安装将基于此文件的工作,而不是从 package.json 重新计算依赖版本。此外,如果 package-lock.jsonnpm-shrinkwrap.json 都存在于包根目录中,则将忽略 package-lock.json

npm installnpm rmnpm update 等都将自动同步现有的锁文件。为了防止发生这种更新,你可以使用--no-save 选项来防止完全保存,或者 --no-shrinkwrap 允许更新 package.json 保留 package-lock.jsonnpm-shrinkwrap.json

注意:强烈建议库作者不要发布此文件,因为这会阻止最终用户控制传递依赖性更新。

问题补充

npm@5、npm@6 版本对于 requires 机制差异!(下图左侧npm@5,右侧npm@6)

228249ccbf7b9f574e935ebfe5c5aa5d.png

是由于官方对其处理方式做了变更:

相关社区讨论:https://npm.community/t/package-lock-json-contains-dynamic-version/6080/9 相关ChangeLog说明:https://github.com/npm/cli/blob/latest/CHANGELOG.md#new-features-7

欢迎关注 「 Super 前端 」微信公众号

f236e45025896e1de04a708b8f0a3430.png
版权声明:
本文原创自我的博客李刚的学习专栏

http://lihuaxi.xjx100.cn/news/247072.html

相关文章

KNN(k-NearestNeighbor)

最近工作中用到求邻近点的方法,于是用上了knn. KNN概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用…

数学学习指南

基础数学学习地图 北京大学数学与应用数学双学位的学分要求 参考文献 Mathematics | MIT OpenCourseWare | Free Online Course Materials我想业余时间系统学习数学,想求一份学习地图,请问我应该该怎么学习呢?学习哪些 和教程呢?…

基于注解的设计模式

2019独角兽企业重金招聘Python工程师标准>>> http://alexradzin.blogspot.com/2013/01/annotation-based-design-patterns.html 转载于:https://my.oschina.net/heatonn1/blog/204789

python中列表和集合_15个例子掌握Python列表,集合和元组

Python中的一切都是对象。每个对象都有自己的数据属性和与之关联的方法。为了有效和恰当地使用一个对象,我们应该知道如何与它们交互。列表、元组和集合是三种重要的对象类型。它们的共同点是它们都被用作数据结构。为了创建健壮且性能良好的产品,必须非…

iOS开发系列--通知与消息机制

http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包括两类&a…

Lynx技术分析-JS引擎扩展设计

JS Binding 技术 Lynx(一个高效的跨平台框架) 的 JS Binding 技术最主要的目的是搭建一个高效的与 JS 引擎解耦的通信桥梁,同时具备 JS 引擎切换的能力。该技术经历了多次迭代,最终通过抽象的引擎接口层设计,在代码层面…

3D Point Cloud Library install

3D PCL的安装具体可看官方GitHub: 链接 我根据官方的操作,“from ._pcl import *”屡次出现错误,最终原因是没加入OPENNI. 如上图所示,将OpenNI2.dll加入pcl的安装路径即可 successd!

电动车逆变器的基础知识

一般来说,电动车使用三相电机,这需要复杂的电压波形进行电力推进。电池提供固定电压的直流电。因此,逆变器通过在加速时将直流转换为交流电,并在制动(再生)时将交流电转换为直流电,从而生成适合…