今天来说说 npm install 和 npm 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