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
值得注意的是,像alpine这样的light node docker图像没有安装Python,Python是node-gyp的依赖项,npm ci使用Python。 我认为为了让npm ci工作,你需要在你的构建中安装Python作为依赖项,这有点固执己见。 更多信息Docker and npm - gyp ERR! not ok
8条答案
按热度按时间ru9i0ody1#
从the official documentation for npm ci开始:
简而言之,使用npm install和npm ci的主要区别在于:
本质上,**
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.json
和package-lock.json
(按此顺序)驱动。*不带参数:安装本地模块的依赖项。
node_modules
中安装任何缺少的依赖项。package.json
或package-lock.json
。npm i packagename
)一起使用时,它可以写入package.json
以添加或更新依赖关系。npm i
)可以写入package-lock.json
以锁定某些依赖项的版本(如果这些依赖项尚未在此文件中)。∮ ∮ ∮ ∮
package-lock.json
或npm-shrinkwrap.json
。package.json
不匹配,则引发错误。node_modules
并同时安装 * 所有依赖项 *。package.json
或package-lock.json
。算法
npm ci
会从package-lock.json
或npm-shrinkwrap.json
产生整个相依性树形结构,而npm install
* 会使用下列算法(来源)更新node_modules
* 的内容:iq0todco2#
npm ci
将删除任何现有的node_modules
文件夹,并依赖于package-lock.json
文件来安装每个包的特定版本。它比npm安装快得多,因为它跳过了一些功能。它的干净状态安装非常适合ci/cd管道和docker构建!您还可以使用它一次性安装所有内容,而不是特定的包。p4rjhz4m3#
虽然其他人都回答了技术差异,但没有人解释在什么情况下两者都要使用。
你应该在不同的情况下使用它们。
npm install
非常适合于开发和CI中缓存node_modules
目录的情况。何时使用此选项?如果您正在制作一个包供其他人使用,则可以这样做 (在这样的版本中不包含node_modules
).关于缓存,要小心,如果你打算支持Node.js
的不同版本,记住node_modules
可能必须重新安装,因为Node.js
运行时要求不同。2如果你想坚持使用一个版本,坚持使用最新的LTS
。在测试和发布生产应用程序时应使用
npm ci
(最终产品,不能由其他软件包使用),因为安装尽可能具有确定性非常重要,此安装将花费较长时间,但最终将使您的应用程序更加可靠 (您确实在这样的版本中包含了node_modules
).坚持使用Node.js
的LTS
版本。npm i
和npm ci
都利用npm高速缓存(如果存在),此高速缓存通常位于~/.npm
。此外,
npm ci
会遵守package-lock.json
文件,这与npm install
不同,npm install
会重写文件并始终安装新版本。git
中的特性分支,您可以缓存node_modules
以提高团队的生产力;对于合并请求和主分支,您可以依赖npm ci
来获得确定性结果。*r7xajy2e4#
您链接的文档具有摘要:
简而言之,使用npm install和npm ci的主要区别在于:
w41d8nur5#
这两个命令在功能上非常相似,但区别在于安装
package.json
和package-lock.json
文件中指定的依赖项所采用的方法。npm ci
会对你的应用的所有依赖项执行全新安装,而npm install
可能会跳过系统上已存在的某些安装。如果系统上已安装的版本不是你的package.json
要安装的版本,即已安装的版本与“required”版本不同,则可能会出现问题。其他的不同之处是
npm ci
从来不接触你的package*.json
文件。如果package.json
和package-lock.json
文件中的依赖版本不匹配,它将停止安装并显示错误。你可以从官方文档here中读到更好的解释。
此外,您可能需要阅读有关包锁here的信息。
aor9mmx16#
值得注意的是,像alpine这样的light node docker图像没有安装Python,Python是
node-gyp
的依赖项,npm ci
使用Python。我认为为了让
npm ci
工作,你需要在你的构建中安装Python作为依赖项,这有点固执己见。更多信息Docker and npm - gyp ERR! not ok
shyt4zoc7#
它会执行干净安装,在需要删除node_modules并重新运行
npm i
的情况下使用它。我不知道为什么有些人认为它是“持续集成”的缩写,有一个
npm install
命令可以作为npm i
运行,还有一个npm clean-install
命令可以作为npm ci
运行。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文件的状态安装不同版本的依赖项。