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