为什么删除 package-lock.json 会破坏构建,但运行“npm install”而不删除它却不会?

dys*_*xit 7 node.js npm package.json

我有一个项目,我从文件中删除了一些不再需要的库package.json,remove node_modules,run npm install,一切都继续按预期工作。

不幸的是,如果我在删除后package-lock.json按照上述相同的步骤操作,我的构建会突然中断。生成了一个新的package-lock.json,但我现在收到了来自某些依赖项的数百个弃用警告,即使项目继续构建这些相同的依赖项也会在意外的地方中断。

如果我恢复到之前的package-lock.json状态并再次运行相同的步骤(remove node_modules、run npm install),警告将再次消失,并且构建再次处于安全状态。

我的理解是,package-lock.json每次我们运行npm install最新的软件包版本时,都会更新,并遵守插入符^和波浪号~限制。如果我们有现有package-lock.json安装和全新安装,此更新是否有所不同?

即使子依赖项之间存在某种冲突,我仍然很困惑为什么更新 a package-lock.jsonwithnpm install效果很好,但npm install在删除该文件后运行会创建一个新的package-lock.json中断文件。经过多次尝试,这种情况始终发生。

Tin*_*ger 2

我对自己的仓库也有同样的困惑。

所以我写这篇文章既是为了你,也是为了你,希望我下次来寻找解决方案时能记住它。

这个 npm 问题的更新为我澄清了一切:

  1. 如果你有一个package.json并且你运行我们会从中npm i生成一个 。package-lock.json
  2. 如果您反对npm ipackage.jsonpackage-lock.json后者将永远不会更新,即使他们package.json会对更新的版本感到满意。
  3. 如果您手动编辑您package.json以具有不同的范围并运行npm i,并且这些范围与您的不兼容package- lock.json,那么后者将更新为与您的package.json. 进一步的运行npm i将与上面的 2 一样。

以下是对您的案例所发生情况的解释:

我有一个项目,我从 package.json 文件中删除了一些不再需要的库,删除了 node_modules,运行了 npm install,一切都继续按预期工作。

在本例中,它正在执行上面的步骤 2。您已经package-lock.json使用所有正确的依赖项版本进行了工作。于是基于package-lock.json. package-lock.json即使您package.json说它会对新版本感到满意,它也不会进行编辑。

不幸的是,如果我在删除 package-lock.json 后按照上述相同步骤操作,我的构建会突然中断。生成了一个新的 package-lock.json,但我现在从某些依赖项中收到了数百个弃用警告,即使项目继续构建这些相同的依赖项也会在意外的地方中断。

在本例中,它正在执行上面的步骤 1。未package-lock.json找到,因此它从 重新创建了您的项目,并根据您的允许package.json更新到较新的版本。package.json然后它package-lock.json根据该安装生成一个新的。对您来说不幸的是,这些更新版本破坏了您的项目。

如果我恢复到以前的 package-lock.json 并再次运行相同的步骤(删除 node_modules,运行 npm install),警告将再次消失,并且构建再次处于安全状态。

这本质上是在做与以前相同的事情。它正在执行上面的步骤 2。由于您再次使用package-lock.json所有正确的软件包版本,它将基于package-lock.json. package-lock.json即使您package.json说它会对新版本感到满意,它也不会编辑。这就是它再次起作用的原因,因为没有任何软件包升级到有问题的版本。

我的理解是,每次我们使用最新的软件包版本运行 npm install 时,package-lock.json 都会更新,并遵守插入符号^和波形符~的限制。如果我们有现有的 package-lock.json 与全新安装,此更新是否有所不同?

是的,这会与上述步骤中所述有所不同。如果您有现有的,package-lock.json它将尊重并安装那些确切的软件包版本。如果您正在进行全新安装,它将更新到package.json.

这就是为什么package-lock.json应该致力于版本控制并且永远不要删除。npm 文档也建议这样做。

有时您可能会想通过删除package-lock.json来解决冲突。这是一个坏主意,正如这个问题中详细解释的那样。相反,您可以手动进行更改package.json然后运行npm install。这就像执行上面的步骤 3 一样。或者你也可以这样做npm update {dependency}npm install {dependency}@2.1.3具有相同的效果。