“npm install”和“;而"npm ci"?

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

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

它更快吗?这会让考试更难吗,之后呢?

265079 次浏览

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

你链接的文档有摘要:

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

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

从# EYZ0:

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

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

< p >从本质上讲, npm install读取package.json以创建依赖项列表,并使用package-lock.json通知安装这些依赖项的哪个版本。# EYZ5。

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

它直接从package-lock.json安装依赖项,并仅使用package.json来验证没有不匹配的版本。# EYZ2。

使用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 ci

  • 至少需要npm v5.7.1
  • 要求出现package-lock.jsonnpm-shrinkwrap.json
  • 如果这两个文件的依赖关系不匹配package.json,则抛出错误。
  • 立即删除node_modules并安装所有依赖项
  • 它从不写入package.jsonpackage-lock.json

算法

npm ci使用以下算法()从package-lock.jsonnpm-shrinkwrap.jsonnpm 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

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

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

其他不同之处在于,npm ci永远不会触及package*.json文件。如果package.jsonpackage-lock.json文件中的依赖版本不匹配,它将停止安装并显示一个错误。

你可以从官方文档在这里中读到更好的解释。

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

值得注意的是,像alpine这样的轻节点docker镜像没有安装Python,这是node-gyp的依赖项,而npm ci使用了Python。

我认为,为了让npm ci工作,你需要在构建中安装Python作为依赖项,这有点自以为是。

更多信息在这里Docker和npm - gyp ERR!不可以

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

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

npm install非常适合开发,当你想要缓存node_modules目录时,在CI中。 什么时候用这个?如果您正在为其他人制作一个使用(你没有在这样的版本中包含node_modules)的包,则可以这样做。关于缓存,要小心,如果您计划支持不同版本的Node.js,请记住,由于Node.js运行时需求之间的差异,node_modules可能必须重新安装。如果你想坚持一个版本,坚持最新的LTS.

npm ci应该在测试和发布产品应用程序(最终产品,不供其他包使用)时使用,因为让安装尽可能确定是很重要的,这个安装将花费更长的时间,但最终会使您的应用程序更可靠(你确实在这样的版本中包含了node_modules)。坚持使用Node.jsLTS版本。

npm inpm ci都使用npm缓存(如果存在的话),这个缓存通常位于~/.npm

此外,npm ci尊重package-lock.json文件。不像npm install,它重写文件并总是安装新版本。

好处:你可以根据你想要的复杂程度来混合它们。在git中的特性分支中,您可以缓存node_modules以提高团队的工作效率,在合并请求和主分支中依赖npm ci以获得确定的结果。

它会进行干净的安装,在需要删除node_modules并重新运行npm i的情况下使用它。

我不知道为什么有些人认为它是“持续集成”的缩写。有一个npm install命令可以作为npm i运行,npm clean-install命令可以作为npm ci运行。