“ npm install”和“ npm ci”有什么区别?

时间:2018-09-25 13:38:40

标签: npm continuous-integration npm-install npm-ci

我正在进行持续集成,并发现了npm ci命令。

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

速度更快吗?这样会使测试变得更难,更好吗?

6 个答案:

答案 0 :(得分:108)

总结:

messaging:contact_form 读取npm install创建依赖项列表,并使用package.json告知要安装这些依赖项的版本。 如果依赖项不在package-lock.json中,它将由package-lock.json 添加。

npm install (以 C 不连续的 I integration命名)直接从npm ci安装依赖项并使用{{ 1}}仅用于验证没有不匹配的版本。 如果缺少任何依赖项或版本不兼容,则会抛出错误

使用package-lock.json添加新的依赖关系,并更新对项目的依赖关系。通常,在拉动更新依赖项列表的更改之后,您将在开发期间使用它,但是在这种情况下使用package.json是个好主意。

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

npm install

  • 安装软件包及其所有依赖项。
  • 依赖关系由npm cinpm install驱动(依此顺序)。
  • 不带参数:安装本地模块的依赖项。
  • 可以安装全局软件包。
  • 将在npm-shrinkwrap.json中安装所有缺少的依赖项。
  • 它可以写入package-lock.jsonnode_modules
    • 与自变量(package.json一起使用时,它可以写入package-lock.json以添加或更新依赖项。
    • 在不带参数的情况下使用(npm i packagename),它可能会写入package.json来锁定某些依赖项的版本(如果该文件中尚未存在这些依赖项的话)。

npm ci

  • 至少需要npm v5.7.1
  • 需要npm ipackage-lock.json出现。
  • 如果这两个文件的依存关系不匹配package-lock.json,则会引发错误。
  • 删除npm-shrinkwrap.json并立即安装所有依赖项
  • 它永远不会写入package.jsonnode_modules

算法

package.jsonpackage-lock.jsonnpm ci生成整个依赖关系树时,package-lock.json 使用以下命令更新npm-shrinkwrap.json 的内容以下算法:

npm install

答案 1 :(得分:8)

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

答案 2 :(得分:4)

您链接的文档具有摘要:

  

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

     
      
  • 项目必须具有现有的package-lock.json或npm-shrinkwrap.json。
  •   
  • 如果程序包锁定中的依赖项与package.json中的依赖项不匹配,则npm ci将退出并显示错误,而不是更新程序包锁定。
  •   
  • npm ci一次只能安装整个项目:此命令无法添加单个依赖项。
  •   
  • 如果node_modules已经存在,它将在npm ci开始安装之前自动删除。
  •   
  • 它永远不会写入package.json或任何包锁:安装实际上是冻结的。
  •   

答案 3 :(得分:2)

虽然其他所有人都回答了技术差异,但没有人解释在哪种情况下应同时使用两者。

您应该在不同的情况下使用它们。

npm install非常适合开发和要在CI中缓存node_modules目录时使用。 什么时候使用?如果您要打包供其他人使用(在此发行版中不包含node_modules,则可以执行此操作。关于缓存,请小心,如果您计划支持Node.js的不同版本,请记住由于node_modules运行时要求之间的差异,可能必须重新安装Node.js。如果您希望使用一个版本,请使用最新的LTS

在测试和发布生产应用程序(最终产品,而不供其他软件包使用)时,应使用

npm ci,因为使安装尽可能具有确定性非常重要。安装将花费更长的时间,但最终将使您的应用程序更可靠(在此版本中确实包含node_modules。坚持使用LTS的{​​{1}}版本。

奖金:您可以根据想要制作的复杂程度来混合它们。在Node.js中的功能分支上,您可以缓存git以提高团队的工作效率,并可以根据合并请求和主分支依靠node_modules来获得确定的结果。

答案 4 :(得分:1)

这些命令在功能上非常相似,但是区别在于安装package.jsonpackage-lock.json文件中指定的依赖项所采用的方法。

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

其他区别是npm ci永远不会触摸您的package*.json文件。如果package.jsonpackage-lock.json文件中的依赖项版本不匹配,它将停止安装并显示错误。

您可以从官方文档here中阅读更好的解释。

此外,您可能想了解有关软件包锁here的信息。

答案 5 :(得分:1)

值得记住的是,像alpine这样的轻型节点docker映像未安装Python,这是node-gyp使用的npm ci的依赖项。

我认为,为了使npm ci正常运行,您需要在构建中安装Python作为依赖项。

此处更多信息Docker and npm - gyp ERR! not ok