提问者:小点点

“NPM安装”和“NPM配置”有什么区别?


我正在使用持续集成,发现了npm ci命令。

我不知道在我的工作流中使用这个命令有什么好处。

是不是更快?这会让考试变得更难吗,好吗,然后呢?


共3个答案

匿名用户

从npm文档中:

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

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

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

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

使用npm install添加新的依赖项,并更新项目的依赖项。通常,您将在开发过程中在提取更新依赖项列表的更改之后使用它,但是在这种情况下使用npmci可能是一个好主意。

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

  • 安装包及其所有依赖项。
  • 依赖项由npm-shrinkwrap.jsonpackage-lock.json(按此顺序)驱动。
  • 不带参数:安装本地模块的依赖项。
  • 可以安装全局软件包。
  • 将安装node_modules中缺少的任何依赖项。
  • 它可能写入package.jsonpackage-lock.json
    • 当与参数(npm i packageName)一起使用时,它可能会写入package.json以添加或更新依赖项。
    • 在不带参数的情况下使用时,(npm i)它可能会写入package-lock.json以锁定某些依赖项的版本,如果这些依赖项不在此文件中。
    • 至少需要npm V5.7.1.
    • 要求存在package-lock.jsonnpm-shrinkwrap.json
    • 如果来自这两个文件的依赖项与package.json不匹配,
    • 将引发错误。
    • 删除node_modules并一次安装所有依赖项。
    • 它从不写入package.jsonpackage-lock.json

    npm cipackage-lock.jsonnpm-shrinkwrap.json生成整个依赖关系树时,npm install使用以下算法(源)更新node_modules的内容:

    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
    

匿名用户

npmci将删除任何现有的node_modules文件夹,并依赖于package-lock.json文件来安装每个包的特定版本。它比npm安装要快得多,因为它跳过了一些功能。它的清洁状态安装是伟大的CI/CD管道和docker构建!您还可以使用它一次性安装所有东西,而不是安装特定的软件包。

匿名用户

您链接的文档具有摘要:

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

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