“与”的区别是什么;npm安装“;及;npm ci“;?

“与”的区别是什么;npm安装“;及;npm ci“;?,npm,continuous-integration,npm-install,npm-ci,Npm,Continuous Integration,Npm Install,Npm Ci,我正在使用持续集成并发现了该命令 我不知道在我的工作流程中使用此命令有什么好处 速度快吗?它是否会使测试变得更困难,好吗?之后?npm ci将删除任何现有的node\u modules文件夹,并依赖package lock.json文件安装每个包的特定版本。它比npm安装要快得多,因为它跳过了一些特性。它的干净状态安装非常适合ci/cd管道和docker构建!您还可以使用它一次性安装所有软件包,而不是特定的软件包。您链接的文档包含以下摘要: 简而言之,使用npm安装和npm ci之间的主要区别是

我正在使用持续集成并发现了该命令

我不知道在我的工作流程中使用此命令有什么好处


速度快吗?它是否会使测试变得更困难,好吗?之后?

npm ci
将删除任何现有的node\u modules文件夹,并依赖
package lock.json
文件安装每个包的特定版本。它比npm安装要快得多,因为它跳过了一些特性。它的干净状态安装非常适合ci/cd管道和docker构建!您还可以使用它一次性安装所有软件包,而不是特定的软件包。

您链接的文档包含以下摘要:

简而言之,使用npm安装和npm ci之间的主要区别是:

  • 项目必须具有现有的package-lock.json或npm-shrinkwrap.json
  • 如果包锁中的依赖项与package.json中的依赖项不匹配,npm ci将以错误退出,而不是更新包锁
  • npm ci一次只能安装整个项目:不能使用此命令添加单个依赖项
  • 如果某个节点已存在,将在npm ci开始安装之前自动删除该节点
  • 它永远不会写入package.json或任何包锁:安装基本上是冻结的
从:

简而言之,使用npm安装和npm ci之间的主要区别是:

  • 项目必须具有现有的package-lock.json或npm-shrinkwrap.json
  • 如果包锁中的依赖项与package.json中的依赖项不匹配,npm ci将以错误退出,而不是更新包锁
  • npm ci一次只能安装整个项目:不能使用此命令添加单个依赖项
  • 如果某个节点已存在,将在npm ci开始安装之前自动删除该节点
  • 它永远不会写入package.json或任何包锁:安装基本上是冻结的

本质上,
npm install
读取
package.json
以创建依赖项列表,并使用
package lock.json
通知要安装这些依赖项的版本如果依赖项不在
package lock.json
中,它将由
npm install
添加

npm ci
(以CcontinuousIntegration命名)直接从
package lock.json
安装依赖项,并使用
package.json
仅验证没有不匹配的版本如果缺少任何依赖项或版本不兼容,它将抛出错误

使用
npm install
添加新的依赖项,并更新项目上的依赖项。通常,在拉动更新依赖项列表的更改之后,您会在开发期间使用它,但在这种情况下,使用
npmci
可能是一个好主意

如果您需要确定的、可重复的构建,请使用npm ci。例如,在持续集成、自动化作业等过程中,以及在第一次安装依赖项时,而不是
npm install

  • 安装程序包及其所有依赖项
  • 依赖关系由
    npm shrinkwrap.json
    package lock.json
    驱动(按顺序)
  • 无参数:安装本地模块的依赖项
  • 可以安装全局软件包
  • 将在
    节点\u模块
    中安装任何缺少的依赖项
  • 它可以写入
    package.json
    package lock.json
    • 当与参数(
      npm i packagename
      )一起使用时,它可以写入
      package.json
      ,以添加或更新依赖项
    • 当在没有参数的情况下使用时,(
      npm i
      )它可能会写入
      package lock.json
      ,以锁定某些依赖项的版本(如果它们不在此文件中)
  • 至少需要npm
  • 需要出现
    package lock.json
    npm shrinkwrap.json
  • 如果这两个文件的依赖项不匹配
    package.json
    ,则引发错误
  • 删除
    节点\u模块
    ,并立即安装所有依赖项
  • 它从不写入
    package.json
    package lock.json
算法 当
npm ci
package lock.json
npm shrinkwrap.json
生成整个依赖关系树时,
npm install
使用以下算法()更新
node\u模块的内容:


这些命令在功能上非常相似,但不同之处在于安装
package.json
package lock.json
文件中指定的依赖项的方法

npm-ci
执行应用程序所有依赖项的干净安装,而
npm-install
可能会跳过一些安装,如果它们已经存在于系统中。如果系统上已安装的版本不是您打算安装的
package.json
,即安装的版本与“必需”版本不同,则可能会出现问题

其他区别是,
npmci
从不接触您的
包*.json
文件。如果
package.json
package lock.json
文件中的依赖项版本不匹配,它将停止安装并显示错误

你可以从官方文件中读到更好的解释


此外,您可能需要阅读有关包锁的内容。

值得记住的是,像alpine这样的轻型节点docker映像没有安装Python,而Python是
load the existing node_modules tree from disk
clone the tree
fetch the package.json and assorted metadata and add it to the clone
walk the clone and add any missing dependencies
  dependencies will be added as close to the top as is possible
  without breaking any other modules
compare the original tree with the cloned tree and make a list of
actions to take to convert one to the other
execute all of the actions, deepest first
  kinds of actions are install, update, remove and move