Node.js中npm i和npm ci的区别


在使用npm (Node包管理器)处理Node.js时,安装项目所需的包非常重要。虽然大多数开发者知道运行npm install或npm i会发生什么,但npm ci经常出现在关于持续集成和持续交付管道的讨论中,以及可重复构建流程中。本文介绍了“npm i”和“npm ci”的区别,以及在什么情况下应该使用其中一个而不是另一个,以及如何使用它们。

什么是npm i (或npm install)?

npm i”实际上是npm install的缩写,这是应用程序中用于安装package.json文件中列出的依赖项的主要命令。

npm i的关键功能

1. 安装package.json中列出的所有依赖项。

2. 如果存在package-lock.json文件,“npm i”将

  • 检查所有依赖项的版本是否完全相同。
  • 这是通过运行命令npm install完成的。如果package.json发生更改,例如添加新的依赖项,则package-lock.json将被更新。

3. 创建或覆盖package-lock.json文件,该文件指示最新安装的版本。

4. 如果不存在这样的文件夹,则它将创建一个node_modules文件夹。如果存在这样的文件夹,它只会复制尚未安装的必要依赖项。

5. 支持版本灵活性:如果不存在package-lock.json,它将下载package.json版本约束中指定的版本。

何时使用npm i?

  • 开发阶段:在包含、更新和修剪依赖项时。
  • 非CI环境:当版本差异是可以接受的,而不是仅仅需要可重复性时。

什么是npm ci?

npm ci仍然代表“持续集成”。它是为需要幂等构建的永久无人值守环境构建的,例如在CI/CD工作流中。

npm ci的关键功能

必须从具有package-lock.json和node_modules目录的工作项目中复制一份。npm ci – 如果package-lock.json文件不可用,则会引发错误。

1. 执行干净安装:它会删除node_modules目录,并更精确地根据package-lock.json文件中的内容部署包。

2. 比npm i更快:与npm install相比,如果只使用package-lock.json并绕过版本解析过程,npm ci运行速度快得多,这在管理CI/CD方面很有优势。

3. 不更新package-lock.json:这也保证了package-lock.json不会更改,因为在部署时您不希望版本更改。

何时使用npm ci?

  • CI/CD管道:可重复构建,因为npm ci命令每次都安装完全相同的依赖项版本。
  • 生产环境:确保生产环境复制测试环境中使用的版本。
  • 快速设置:由于安装速度更快,因此适用于安装至关重要且依赖项更改较少的情况。

npm i和npm ci的主要区别

下表突出显示了“npm i”和“npm ci”的主要区别:

特性 npm i npm ci
安装行为 基于package.json安装,更新package-lock.json 仅基于package-lock.json安装,不更新
版本解析 解析版本,可能会更新package-lock.json 跳过版本解析,安装速度更快
可重复性 不能保证跨环境一致性 确保构建一致性
用例 开发,灵活安装 CI/CD,生产,可重复安装
依赖项文件夹 根据需要更新或创建node_modules 在安装之前删除node_modules
速度 较慢(尤其是在大型项目中)

由于严格遵守锁定文件而更快

示例场景

1. 开发新功能:要安装依赖项并添加或修改包,请使用“npm i”命令。如果存在任何更改,这也会将package-lock.json更改为新的更改。

2. 在CI/CD中部署Web应用程序:请使用“npm ci”安装package-lock.json文件中定义的精确版本。这确保了环境的副本,这对于避免某些部署问题非常重要。

3. 仓库的新克隆:如果您正在使用新的克隆,并且希望安装package.json中指定的精确依赖项,请使用npm ci而不是npm i。这样,安装速度非常快,并且它们不会从源代码构建,因此克服了因依赖项版本更新而可能出现的任何潜在问题。

npm i和npm ci的最佳实践

  • 保持package-lock.json更新:确保经常签入package-lock.json文件,以确保您拥有正确的依赖项树。
  • 在CI/CD管道中使用npm ci:它专门用于CI/CD场景,在这些场景中,意外使用npm install可能会导致版本不匹配。
  • 在本地运行npm i:远程使用“npm ci”:对于本地开发,“npm i”更为宽松,而在远程构建或部署中,“npm ci”带来一致性。

结论

npm inpm ci都是非常重要的命令,在用Node.js编写的项目中具有特定的作用。虽然npm i对于开发非常有用且适用,但npm ci旨在确定性和理想的生产管道。在本文中,我们演示了如何识别开发团队和运营团队之间的差异,以及如何利用它来优化开发流程并提高部署的可靠性。

更新于:2024年11月8日

浏览量:25

开启你的职业生涯

完成课程获得认证

开始学习
广告