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

iibxawm4  于 2022-12-19  发布在  其他
关注(0)|答案(8)|浏览(315)

我正在研究持续集成,发现了npm ci命令。
我不知道在我的工作流中使用这个命令有什么好处。
是不是更快了?是不是让测试更难了,好吧,之后呢?

ru9i0ody

ru9i0ody1#

the official documentation for npm ci开始:
简而言之,使用npm install和npm ci的主要区别在于:

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

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

npm ci(也称为CleanInstall)旨在用于自动化环境--例如测试平台、持续集成和部署--或者,任何您希望确保您正在对依赖项进行全新安装的情况。

它直接从package-lock.json安装依赖项,并仅使用package.json来验证是否存在不匹配的版本。如果缺少任何依赖项或具有不兼容的版本,它将引发错误
使用npm install可添加新的依赖项,以及更新项目的依赖项。通常,您会在提取更新依赖项列表的更改后的开发过程中使用它,但在这种情况下使用npm ci可能是一个好主意。
如果需要确定性的、可重复的生成,请使用npm ci。例如,在持续集成、自动化作业等过程中以及首次安装依赖项时,请使用npm install,而不要使用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 ci会从package-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
iq0todco

iq0todco2#

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

p4rjhz4m

p4rjhz4m3#

虽然其他人都回答了技术差异,但没有人解释在什么情况下两者都要使用。

你应该在不同的情况下使用它们。
npm install非常适合于开发和CI中缓存node_modules目录的情况。何时使用此选项?如果您正在制作一个包供其他人使用,则可以这样做 (在这样的版本中不包含node_modules.关于缓存,要小心,如果你打算支持Node.js的不同版本,记住node_modules可能必须重新安装,因为Node.js运行时要求不同。2如果你想坚持使用一个版本,坚持使用最新的LTS
在测试和发布生产应用程序时应使用npm ci(最终产品,不能由其他软件包使用),因为安装尽可能具有确定性非常重要,此安装将花费较长时间,但最终将使您的应用程序更加可靠 (您确实在这样的版本中包含了node_modules.坚持使用Node.jsLTS版本。
npm inpm ci都利用npm高速缓存(如果存在),此高速缓存通常位于~/.npm
此外,npm ci会遵守package-lock.json文件,这与npm install不同,npm install会重写文件并始终安装新版本。

  • 额外好处:您可以根据自己的需求将它们混合使用。对于git中的特性分支,您可以缓存node_modules以提高团队的生产力;对于合并请求和主分支,您可以依赖npm ci来获得确定性结果。*
r7xajy2e

r7xajy2e4#

您链接的文档具有摘要:
简而言之,使用npm install和npm ci的主要区别在于:

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

w41d8nur5#

这两个命令在功能上非常相似,但区别在于安装package.jsonpackage-lock.json文件中指定的依赖项所采用的方法。
npm ci会对你的应用的所有依赖项执行全新安装,而npm install可能会跳过系统上已存在的某些安装。如果系统上已安装的版本不是你的package.json要安装的版本,即已安装的版本与“required”版本不同,则可能会出现问题。
其他的不同之处是npm ci从来不接触你的package*.json文件。如果package.jsonpackage-lock.json文件中的依赖版本不匹配,它将停止安装并显示错误。
你可以从官方文档here中读到更好的解释。
此外,您可能需要阅读有关包锁here的信息。

aor9mmx1

aor9mmx16#

值得注意的是,像alpine这样的light node docker图像没有安装Python,Python是node-gyp的依赖项,npm ci使用Python。
我认为为了让npm ci工作,你需要在你的构建中安装Python作为依赖项,这有点固执己见。
更多信息Docker and npm - gyp ERR! not ok

shyt4zoc

shyt4zoc7#

它会执行干净安装,在需要删除node_modules并重新运行npm i的情况下使用它。
我不知道为什么有些人认为它是“持续集成”的缩写,有一个npm install命令可以作为npm i运行,还有一个npm clean-install命令可以作为npm ci运行。

v1uwarro

v1uwarro8#

npm install命令用于安装项目的package.json文件中列出的依赖项,而npm ci命令用于安装package-lock.json或npm-shrinkwrap.json文件中的依赖项。(CI)环境,其中package-lock.json或npm-shrinkwrap.json文件签入到版本控制中并且不应被修改。因为npm ci从一个锁定的文件中安装依赖项,所以与npm install相比,它是一种更快、更可靠的安装依赖项的方法,后者可以根据package.json文件的状态安装不同版本的依赖项。

相关问题