yarn.lock、package-lock.json、npm-shrinkwrap.json的区别

2023-11-01

总的来说yarn.lock和package-lock.json起的作用相同。只不过yarn是默认的,npm到5以后才会出现lock
package-lock.json是npm5的新特性,也不向前兼容,如果npm版本是4或以下,那得用npm-shrinkwrap.json

1. 先说下yarn下载包的流程

第一次,首先执行yarn install,会按照语义版本控制规则(在下面会解释)下载最新的依赖包并且构建为依赖关系树,也就是把共有的部分提取出来。然后生成yarn.lock文件。并且生成本地缓存。
以后执行yarn install会先对比package.json版本号和yarn.lock版本号是否一致。分两种情况:
(1)如果不一致会根据package中的版本号以及语义版本控制规则去下载最新的包,并更新至yarn.lock
(2)如果一致,会根据lock查看缓存进行复制,没有缓存就按照路径下载,注意:这里不会理会package实际包的版本是否有更新。这个比如删除node_moudles后再执行yarn install会复制缓存,而不是重新下载,同时也会根据yarn.lock文件中依赖的相互关系生成依赖树,版本也和package中的相同。

npm5中是 如果改了package.json,且package.jsonpackage-lock.json文件中包版本号不一致,那么执行npm i时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。如果两者是同一状态,那么执行npm i都会根据lock下载,不会理会package实际包的版本是否有新。和yarn是一样的。

2. npm-shrinkwrap.json 与 package-lock.json的区别与联系

从npm版本看
package-lock.json是npm5的新特性,也不向前兼容,如果npm版本是4或以下,那得用npm-shrinkwrap.json

从npm处理机制来看

  • 在一个项目里,如果本身不存在这两个文件,那么在运行npm install时,会自动生成一个package-lock.json,或者在初始化一个项目npm init时,也会生成package-lock.json,安装信息会依据该文件进行,而不是单纯按照package.json,这两个文件的优先级都比package.json
  • 如果项目两个文件都存在,那么安装的依赖是依据npm-shrinkwrap.json来的,而忽略package-lock.json
  • 运行命令npm shrinkwrap后,如果项目里不存在package-lock.json,那么会新建一个npm-shrinkwrap.json文件,如果存在package-lock.json,那么会把package-lock.json重命名为npm-shrinkwrap.json

从文件更新来看
npm-shrinkwrap.json只会在运行npm shrinkwrap才会创建/更新
package-lock.json会在修改pacakge.json或者node_modules时就会自动产生或更新了。

从发布包来看
package-lock.json不会在发布包中出现,就算出现了,也会遭到npm的无视。
npm-shrinkwrap.json可以在发布包中出现

3. 解释与实践

项目package.json中包版本号前如果有^ ~之类的会按照语义版本控制规则(也可以看下这个博客https://blog.csdn.net/ZQ_KING/article/details/81560075)安装规则下最高版本的包(只限定于没有lock文件时候。如果有lock文件会根据lock文件中的下载路径下载,当然你可以在有lock文件情况下yarn upgrade vue,就会按照语义规则下最高版本的包下载)。但是package.json中的对应包的版本号没变,只改变了yarn.lock中对应包的部分信息和node_moudles中的对应包。(比如执行yarn upgrade vue时vue:2.6.5的包会下载2.6.5的包,vue:^2.6.5的包会下载2.6.10最新的包,如果yarn upgrade vue@版本号就会下载对应版本的包)
比如拿vue这个包来说,现在最高版本号是2.6.10,我package.json文件中版本号是^2.6.6,当yarn install时,它会下载>=2.6.6 <3.0.0间最大的就是2.6.10版本号的vue包(只限定于没有lock文件,有lock文件会根据lock中的路径下载对应版本)。它会先更新node_moudles然后更新yarn.lock中vue包内容。下载完成后package.json中vue版本号还是vue : ^2.6.6,更新yarn.lock文件中vue包的详细信息为:
在这里插入图片描述
实际上node_moudles中下载的是2.6.10版本的。所以说提不提交yarn.lock到代码托管平台是有争议的,因为提交了可能依赖会有地雷,不提交依赖关系可能会出错,一般来说是应该提交的。可以看这个(为什么我不使用 shrinkwrap(lock)

4. yarn.lock文件的作用(自己理解的,如有错误请指出)

yarn.lock是为了维护树关系,保证依赖间的相互关系,和包的下载路径。如果改了package.json版本号,且package.json和lock文件版本号不同,那么执行yarn install时,会根据package中的版本号以及语义含义去下载最新的包,并更新至lock。这也是yarn.lock提交到代码托管平台的原因。因为安装依赖时会按照lock中下载路径走,并且不需要重新生成依赖关系树了,其他机器yarn install时包间依赖关系和版本就不会出现的错误。npm中npm install有可能会因为包间的版本不同导致版本和依赖错误(除非有package.lock.json文件)。

总的来说yarn.lockpackage-lock.json起的作用相同。只不过yarn是默认的,npm到5以后才会出现lock。两者确定包间的依赖关系算法也不同,总之yarn就是为了弥补npm的缺陷而出现的。

5. 相关链接

yarn:
https://yarn.bootcss.com/docs/dependency-versions/(版本范围规则)
https://yarn.bootcss.com/blog/2016/11/24/lockfiles-for-all/(yarn.lock文件应该提交到托管平台上)
https://yarn.bootcss.com/docs/yarn-lock/(yarn.lock文件解释)

npm:
https://www.zhihu.com/question/264560841(package-lock.json 需要写进 .gitignore 吗?)
https://juejin.im/post/5c53bea8e51d457fbe226efb(对npm包精准控制之npm-shrinkwrap.json与package-lock.json)
https://zhuanlan.zhihu.com/p/22934066(为什么我不使用 shrinkwrap(lock))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yarn.lock、package-lock.json、npm-shrinkwrap.json的区别 的相关文章

  • 在nodejs运行时检查包版本?

    我在 package json 中将一些条目定义为 dependencies express 4 passport body parser express error handler 我不想将这些值冻结到当前版本 我如何知道我的包在运行时是
  • 如何获取未保存到 package.json 的包列表?

    我在本地计算机上安装了几个软件包 但我不知道安装了哪些 是否有一些框架可以显示我的项目中安装了哪些软件包和版本 未保存 保存和开发保存 我尝试比较node modules文件夹 但结果不是很精确 你想要的是npm list npm ls是方
  • 在 npm 上使用 firebase 部署时出错 --prefix $RESOURCE_DIR run lint

    我全新安装了 firebase 工具 在此之后tutorial https firebase google com docs functions get started 我正在尝试上传我的第一个 firebase 函数 我在运行 fireb
  • 通过 npm 节点自动化 Git 提交 + 版本控制 + 标记

    我一直试图得到的是 使用 npm version 来更新 package json 并创建一个标签 然后提交我的更改 通过这种方式 我将能够按版本添加标签 自动版本控制并提交信息 我遇到的问题是 当我使用 npm 版本时 它会自动执行标记
  • Anaconda 中的依赖项和包冲突?

    我在 Windows 10 计算机上使用 Anaconda 5 1 和 Python 3 6 我遇到了很多问题 我尝试向我的 conda 环境添加一些有用的工具 例如 lightGBM tensorflow keras bokeh 但是一旦
  • SSIS - 在整个项目中更改对变量/参数的引用

    我创建了一个 SSIS 项目 认为它将以项目部署模式进行部署 我的很多包都有 2 个参数 称为P OdsTbl and P SrcEtl 每当我使用执行包任务时 我都会将子参数绑定到父参数 我发现该项目将以包部署模式部署 这意味着我需要将参
  • create-react-app 之后 React npm start 不起作用

    我正在学习 React 而且我的英语很差 我已经有两个反应项目 但它们也不起作用 我按照以下步骤操作 npx 创建反应应用程序我的应用程序 cd 我的应用程序 npm 启动 但它不起作用 我尝试清理缓存并再次安装 npm 但没有成功 我该如
  • 如果 package.json 中的脚本抛出错误,如何定义自定义 console.log?

    如果我的自定义 npm 脚本抛出错误 是否可以添加自定义 console log 或者是否可以将自定义 console log 添加到脚本中 我的脚本对象中有此条目包 json check npm list depth 0 grep 并且需
  • 尝试安装 gulp 时 npm 挂起

    UPDATED 当我尝试使用 npm install 或任何变体安装任何软件包时 npm install gulp g verbose npm install gulp verbose npm install gulp npm instal
  • 错误:任务“:app:packageDebug”执行失败 - Java 堆空间

    当我尝试构建 APK 时 我在 Android Studio 日志中收到此错误 错误 任务 app packageDebug 执行失败 Java堆空间 当我尝试在资产目录中构建 350 MB 大小的 sqlite 的 APK 时 就会出现此
  • 个人Vue 3组件包缺少模板或渲染函数

    我最近将自己的 Vue 3 组件上传到 NPM 以供其他人使用 当在其他项目中使用它时 它会发出以下警告 Vue warn Component is missing template or render function at
  • 如何在rails中使用npm包?

    我正在尝试使用王牌编辑 https github com ajaxorg ace在我的 Ruby on Rails 应用程序中 大部分视图由 React 组件组成 我正在使用反应轨道宝石 https github com reactjs r
  • Oracle 9i:同义词表不存在?

    我创建了一个包 其中包含一个存储过程 我计划从单独的应用程序调用该存储过程 存储过程将返回架构中所有视图和表的排序列表 为此 它对 DBA TABLES 和 DBA VIEWS 同义词执行简单的选择 如下所示 CREATE OR REPLA
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • python下安装xgboost 32位msys失败

    尝试安装 xgboost 失败 Windows 和企业版版本为 Anaconda 2 1 0 64 位 我该如何继续 我一直在使用 R 似乎从 RStudio 在 R 中安装新包相当容易 但在间谍程序中则不然 因为我需要进入命令窗口来执行此
  • 可以明确声明包依赖项的版本吗?

    我倾向于对我编写的代码进行明确而不是隐含的描述 因此 在成功创建自己的包之后 我立即想到的下一件事是如何最好地确保代码的健壮性和可靠性 其中一部分与我的包所依赖的包有关 实际问题 在这方面 是否可以明确声明需要 期望哪个版本的包依赖项 我正
  • Nodemailer:从未收到问候语

    当尝试使用 Nodemailer 在 Node 内发送电子邮件时 https github com nodemailer nodemailer https github com nodemailer nodemailer 调用sendMai
  • django npm 和 Node 包架构

    在我加入的项目中 这是以下架构node packages Django project app1 app2 node modules foundation sites grunt static css images js urls py s
  • npm 命令 create-react-app 失败

    我正在尝试在运行 Os X sierra 10 12 6 的计算机 mac pro 2017 上测试reactjs 我已经遵循了 Facebook 教程 确保您安装了最新版本的 Node js done 按照安装说明进行操作创建一个新项目
  • 是否有“npmpublish-f”的解决方法

    现在npm publish f已弃用 是否有解决方法或软件包可以覆盖发布后的目标版本 我知道关于semver http semver org 我还想要npm publish f 您可以取消发布特定版本 然后重新发布它 npm unpubli

随机推荐

  • 【源码】走一遍源码弄清ArrayList容器的扩容机制

    源码 走一遍源码弄清ArrayList容器的扩容机制 首先我们来看看ArraysList容器在整个Java集合框架中所处的位置 由此可见ArrayList是Java集合框架中 两大派系中Collection接口的子接口List的实现类 我们
  • 在macOS上搭建Flutter开发环境

    准备工作 1 下载flutter sdk 2 安装xcode 安装Android Studio 3 安装 Homebrew 安装fvm 安装adb 配置 1 环境变量配置 打开终端查看 ls a 1 打开 open bash profile
  • 作用域链的理解

    一 作用域 作用域又分为了 全局作用域 和 函数作用域 ES6 之前 JavaScript 没有块级作用域 只有全局作用域和函数作用域 ES6 的到来 为我们提供了 块级作用域 可通过新增命令 let 和 const 来体现 全局作用域 在
  • Hexo+next主题美化静态博客

    前言 需要在Hexo下配置next主题 Hexo配置next主题教程 点我跳转 更改配置以后使用素质三连 hexo clean hexo g hexo s即可本地看到效果 hexo clean hexo g hexo s 注 部分参考自互联
  • CSS3有趣的渐变色

    程序设计之道无远弗届 御晨风而返 杰佛瑞 詹姆士 这里给大家分享几个有趣的渐变色 用来丰富页面 一 背景色渐变 经常用的就是给背景色增加渐变效果 这里的语法顺序不要错 牵扯到优雅降级和渐进增强 标准语法写到最后也是为了兼容各个版本浏览器 让
  • curl命令的使用

    curl是利用URL语法在命令行方式下工作的开源文件传输工具 1 CURL URL 获取当个网页源码 默认将输出打印到标准输出中 curl www baidu com 2 CURL o O选项保存下载的文件到指定的文件中 o 将文件保存为命
  • AI工程师职业规划指南——中科院大牛告诉你如何成为一名语音识别工程师

    语音识别基础知识 数学与统计学 数学是所有学科的基础 其中的高等数学 数理方程 泛函分析等课程是必要的基础知识 概率论与数理统计也是语音识别的基础学科 声学与语言学 声学基础 理论声学 声学测量等是声学方面的基础课程 有助于了解更多声学领域
  • ElasticSearch学习笔记

    一 ES核心概念 elasticsearch 是面向文档的 一切都是 Json ES关系型数据库的对比记忆 ElasticSearch 关系型数据库 索引 indices 数据库 database 类型 types 表 tables 文档
  • Hive 数据仓库基础应用---第一篇

    hive 的数据定义语句 DDL 创建数据库 语法格式如下 CREATE DATABASE IF NOT EXITS database name COMMENT database comment LOCATION hdfs path WIT
  • arm架构安装docker-compose

    先安装好Docker 华为云arm架构安装Docker arm架构下安装docker compose 官网地址 https github com docker compose releases 官方没有提供arm架构的包 自己去找arm架构
  • 迅雷下载器无限制版_无敏感_无限速

    迅雷下载器5 8 下载链接 链接 https pan baidu com s 1ZYf1aRwZvW4PUT7qO0lKIg 提取码 if5x 速度如图 转载于 https www cnblogs com yzhyingcool p 109
  • CSS使网页适应不同屏幕大小(最实用的rem基础屏幕的适配方案)

    先看代码 复制使用即可 以下代码均可复制粘贴使用 我将以注释的形式解释代码左右 如您满意请给莫成尘点个Fabulous 牛顿说过 我之所以看得远 是因为我站在巨人的肩膀上 我们充分借鉴了element antd等的方案来适配 需 要 注 意
  • kafka消息删除机制

    kafka过期消息删除过程 有时候总觉得我的消息没到7天就被删除了 我还以为是我的kafka配置没有生效 了解到 kafka删除机制后才恍然大悟 kafka消息首先由用户设定一个或多个partition 每个partition中kafka会
  • 光圈

    镜头上写 1 1 8 说明该镜头的最大光圈是f 1 8 F number 光圈值 F number 指的是focal length number aperture 光圈 光圈指得是镜头中间开孔的大小 光圈的作用在于决定镜头的进光量 光圈值越
  • 机器学习基础篇(十二)——多层感知机

    机器学习基础篇 十二 多层感知机 一 概述 多层感知机 MLP Multi Layer Perceptron 由感知机 PLA Perceptron Learning Algorithm 推广而来 它最主要的特点是有多个神经元层 因此也叫深
  • 大咖云集,EI稳定检索,第14届机器学习与计算国际会议(ICMLC 2022)

    14th ICMLC 2022 第14届机器学习与计算国际会议 2月18 21日 中国广州 关于我们 机器学习是人工智能及模式识别领域的共同研究热点 其理论和方法已被广泛应用于解决工程应用和科学领域的复杂问题 为了给机器学习与计算研究领域的
  • 自带win10系统换win7的那些坑

    自带win10系统换win7的那些坑 这两天真是经历了一个换系统的巨坑 如果说这次换系统是一部历史的话那也一定是一部血泪史 今日4000多字的记录会把这部血泪史中的血和泪一一道出 不为别的只为 前车之鉴后事之师 更多内容请关注微信公众号 u
  • QTableView如何插入图片(ICON)在文字的右边

    QTableView如何插入图片 ICON 在文字的右边方法一 QStyledItemDelegate 继承自 QAbstractItemDelegate 主要用于为 Model View 中的数据项提供显示和编辑功能 采用继承QStyle
  • JavaScript运算符优先级

    JavaScript 运算符优先级 是描述在计算机运算计算表达式时执行运算的先后顺序 先执行具有较高优先级的运算 然后执行较低优先级的运算 例如 我们常说的先执行相乘和除 再执行加减运算 JavaScript 运算符 圆括号处理Javasc
  • yarn.lock、package-lock.json、npm-shrinkwrap.json的区别

    总的来说yarn lock和package lock json起的作用相同 只不过yarn是默认的 npm到5以后才会出现lock package lock json是npm5的新特性 也不向前兼容 如果npm版本是4或以下 那得用npm