今天来说说 npm installnpm ci 的区别,以及附加选项—legacy-peer-deps--force

最近,在stack overflow 经常 看到开发者提出以下问题:

  • 为什么 CI/CD 管道不再工作?我们只是想做一个错误修复。两周前一切正常,现在管道却失灵了。
  • 我们运行了 "npm install",现在却出现了类型错误。我们做错了什么?
  • "npm install "失败的原因是某些对等依赖冲突。我们添加了"- legacy-peer-deps",现在有些依赖在构建时丢失了。为什么会这样?
  • 更改了 .npmrc 中的 artifactory URL。但是,每次执行 npm install 时,旧的 artifactory URL 都会添加到 package-lock.json 中。为什么会这样?

"npm install" vs "npm ci"

大多数时候,依赖版本都列在一个插入符号(^)或波浪号(~)前面。在这种情况下,npm 将不会安装给定的确切版本,而是在给定范围内的最新版本。

  • ~version:“大约等于版本”(~1.2.3 := >=1.2.3 <1.(2+1).0 := >=1.2.3 <1.3.0–0)
  • ^version:“与版本兼容”(1.2.3 := >=1.2.3 <2.0.0–0)

npm install

使用 npm install 时,不仅会下载并将 package.json 中列出的最新依赖包及其对等依赖包添加到本地的 node_modules 文件夹中,还会将其放入操作系统特定的缓存文件夹中,并将给定的依赖树存储在 package-lock.json 中。因此,删除整个 node_modules 文件夹并不意味着重新下载所有内容,而是在缓存文件夹中搜索相关软件包。

npm ci

npm install 不同,npm ci 命令使用 package-lock.json,并根据此树安装所有依赖项。因此,只要 package-lock.json 不发生变化,每次执行 npm ci 时都会安装完全相同的依赖项。

“—legacy-peer-deps”与“—force”

在安装过程中,可能会出现对等依赖冲突。

什么是对等依赖冲突?如果两个或多个依赖需要不同版本的包。例如,如果包A需要版本2.0.0,包B需要版本1.0.0

使用-legacy-peer-deps时,安装过程中会忽略并跳过对等依赖关系[ 3]。因此,不会再发生对等依赖关系冲突。这是推荐使用的选项。不过,这也可能导致软件包丢失。

如何应用此选项?该选项可以添加到 npm 配置中,也可以作为附加参数传递。

npm config set legacy-peer-deps=true --location=project
npm ci --legacy-peer-deps

另一方面,-force 不会跳过对等依赖关系,而是安装所有相关的对等依赖关系版本。这可能不是我们想要的行为,因为这会增大 node_modules 文件夹。

npm install --force

简而言之,使用 -legacy-peer-deps 就可以了。不过,如果遇到依赖项缺失的情况,则应使用 -force

从头开始安装依赖

有时,开发人员希望删除所有现有的本地依赖项,然后重新安装所有内容。例如,如果 artifactory URL 已经更改,他们被要求本地测试更改。这可以按照以下方式完成。

// 删除本地node_modules文件夹
rm -rf node_modules

// 删除所有缓存的依赖
npm cache clean --force

npm install --force

设置正确的artifactory

artifactory 必须在用户文件夹中存储的.npmrc文件中设置。不幸的是,只能配置一个artifactory。然而,如果你想使用多个,可以使用范围限定仓库。

registry=https://FIRST-REPO-URL

// 定义一个范围限定的存储库
@test:registry=http://SECOND-REPO-URL

问题

提问1:为什么 CI/CD 管道不再工作?我们只是想做一个错误修复。两周前一切正常,现在管道却失灵了。

在本例中,CI/CD 管道没有使用 npm ci,而是使用了 npm install。由于版本库不是定期更新,只是偶尔更新一次,因此安装了较新的软件包,并覆盖了 package-lock.json。这确实导致了一些类型错误。因此,请始终使用 npm ci

问题2:我们运行了 "npm install",现在却出现了类型错误。我们做错了什么?

与之前的问题相同。出现以下错误:

Type 'Server' is not generic

@types/ws 必须添加确切的版本。

"@types/ws": "8.5.4"

问题3:"npm install "失败的原因是某些对等依赖冲突。我们添加了"- legacy-peer-deps",现在有些依赖在构建时丢失了。为什么会这样?

跳过了同行依赖关系。这确实导致了依赖关系的缺失。因此,必须使用 npm ci - force

问题4:我们更改了 .npmrc 中的 artifactory URL。但是,每次执行 "npm install "时,旧的 artifactory URL 都会添加到 package-lock.json 中。为什么会这样?

本地节点模块文件夹已被删除。但是,操作系统专用缓存文件夹中仍包含所请求的依赖项。必须执行以下命令:

npm cache clean --force

总结

总之,请在 CI/CD 管道中使用 npm ci。否则,由于依赖版本的更新,构建可能会中断。

交流

首发于公众号 大迁世界,欢迎关注。📝 每周一篇实用的前端文章 🛠️ 分享值得关注的开发工具 ❓ 有疑问?我来回答

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。


王大冶
68k 声望104.9k 粉丝