使用"npm ci"代替"npm install"来实现确定性的项目设置

15
给定一个项目,在该项目中,package-lock.json在源代码控制中进行管理,目的是使团队中的所有开发人员获得完全相同的依赖项。
从npm的文档中,我认为开发人员应该使用npm ci来设置他们的开发环境,可能在更新依赖项时也应该使用npm ci
然而,我在典型的npm项目中看到的指令仍然是使用npm install
开发人员是否应该使用npm install而不是npm ci?在这种情况下,npm ci是否有缺点?
我知道npm ci会删除整个node_modules,因此可能会重新下载一些已经存在的依赖项。
但是,我经常遇到npm install实际上会更改package-lock.json的情况(请参见下面的链接),这绝对不是传统项目设置中所期望的,其中主要目标是让所有开发人员获得相同的环境。
因此,我建议使用npm ci
“npm install”出现“意外”行为的示例:

1
在我看来,每次安装时更新软件包锁定是一件好事 - 想想如果你永远冻结完全相同的版本,你将会错过依赖项的错误修复和安全更新。 - Patrick Hund
8
@PatrickHund 是的,但应以受控方式进行,而不是在某个时间点“意外”运行npm install。在“传统”的软件项目中,确保所有团队成员拥有完全相同的环境至关重要。否则,我们会出现非确定性行为。这就是拥有锁定文件的主要原因。 - jbandi
2
如果您使用的是最近的npm(5.4.2之后),则不应看到package-lock更改。如果您看到了一些更改,那只能是因为不同的npm版本使用了不同的package-lock格式,或者因为操作系统的差异(某些依赖项在某些操作系统中是可选的)。依赖项的版本不应更新。 - Aruna Herath
2
@PatrickHund 这是一件糟糕的事情。锁定文件的整个目的就是为了避免这种情况发生。我们确实需要不时地更新锁定文件,例如在主要版本发布时。但如果每次运行npm i都会更新锁定文件,那么我们可能根本不需要使用它们。 - Aruna Herath
1
@ArunaHerath 谢谢!所以 npm install 已经有所改进……但是使用 npm ci 有没有不使用的理由?如果您在回答中写出这一点,我会接受它…… - jbandi
2个回答

1

每当您需要一个可重现的环境时,应使用npm ci(清洁安装)。 您是正确的:开发团队大多数时间都应该使用它。

仅在修改软件包或准备升级依赖项(其中之一执行此操作并解决冲突后,在提交package.jsonpackage-lock.json之后,其他人继续执行npm ci)时才使用npm install

请参见我的答案,了解每个工具的用途。


0

在本地构建或更新依赖项时,使用 npm ci 而不是 npm i 没有什么理由(因为它使用 npm 缓存,速度大致相同),但以下情况下可以考虑使用 npm i

  1. 您实际上希望自动接收直接依赖项的小型/补丁更新;
  2. 如果您手动更改了 package.json 中的版本并希望它们胜过 package-lock.json 中的版本。

2
如果你是一个独立开发者,那么这可能没问题。但如果不是,使用 npm ci 可以避免很多“在我的电脑上可以运行”的奇怪问题。另一方面,npm ci 无法更新单个依赖项;这是 npm install 的功能。 - Ictus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接