我们的package-lock.json 为什么总会变

2,972 阅读3分钟

一、问题产生

在我们的工作学习之中,我们去拉取远程的分支过后,我们往往都会想着要重新去install一下,以去追求依赖的同步。但这里有两个问题,不知道你是否去注意到并想过呢?

  1. 为什么我们想要的就是按照现有的package.json去重新下载资源,但是往往我们npm install过后,lock.json 也会改变。 这正常么? 背后的原因是什么? 如果不清楚这个的话,lock.json被莫名其妙的改动,还真是让人担心
  2. 我们有的时候不假思索的这一套操作,可能一般时候都是ok的。但是一定对么?

虽然资源的下载我们往往很快就可以完成,但是如果我们对以上的细节并不清楚的话,就难以保证我们的资源不会出问题。

二、 package.json 和 package-lock.json

在我们回答第一个问题之前,我会在说一些关于 package.json 和 package-lock.json。

关于package-lock.json 我们或多或少的都会知道一些,但是如果我们无法清晰第一个问题的话,那说明还是有一些遗漏的

因为我的npm版本是6.x 所以就主要以6为基础去说一下,可以符合大多数人的场景。

首先说一些官方的概念让我们有一个基本的认识

对于npm修改“node_modules”树或“package.json”的任何操作,都会自动生成json。它描述了生成的确切树,以便后续安装能够生成相同的树,而不考虑中间依赖项更新。

这句话用我们自己的理解呢?就是说像是npm install这种更改 node_modules的操作,都会生成package-lock.json。

先说一下package-lock.json里面大致的内容,我们一般都会发现package-lock.json的内容会比package.json多很多,这是因为package-lock.json里是会保存项目所有的依赖(包括依赖的依赖)的版本,下载地址等所以往往还会有一个树型的结构。

再说一下package-lock.json生成的逻辑,这个生成的逻辑并不是一成不变的,经过了一些更新,这里我目前用的更新规则,由5.4.2开始

如果改了package.json,且package.json和lock文件不同,那么执行npm i时npm会根据package中的版本号以及语义含义去下载最新的包,并更新至lock.json。

三、 package-lock.json为什么会变动

经过以上的讲解,我们已经知道package-lock.json的生成逻辑,所以我们也就可以进一步去分析,当package-lock.json在我们意料之外的变动之时,是触发了什么样的改变

以上说了package.json和lock文件不同的条件下,会进行更新,也同样说明如果在package.json和lock文件没有冲突的时候就不会有更新产生。因为在我们package.json中,对相应依赖的要求可能是不同的,比如要求范围或者最低版本等。这样的话比如当我们想要更新的版本超过了lock的版本,尽管被lock住,就仍然需要更新lock文件。因为其还包括依赖的依赖等,所以相应的情况也就变得常见

四、 开发的建议

所以经过以上的分析,我们大概可以知道,如果是在我们开发中操作npm install 之后,package-lock.json得到更新。我们也并不需要紧张,它是不会无缘无故被更改的,更改也往往是为了更准确的反映出我们的依赖结构

所以,当我们并不想要主动对包进行调整的情况下,我们可以直接使用npm ci,去保证构建环境的准确性,它会更严格的去按照lock文件进行安装