Web*_*man 143 continuous-integration npm npm-install npm-ci
我正在进行持续集成并发现了npm ci命令.
我无法确定在我的工作流程中使用此命令的优点.
它更快吗?它会使测试更难,好吗,之后?
luc*_*aro 228
综上所述:
npm install读取package.json以创建依赖项列表,并用于package-lock.json通知要安装这些依赖项的版本.如果不包含依赖项package-lock.json,则将添加依赖项npm install.
npm ci(以C ontinuous I ntegration 命名)直接从中安装依赖项package-lock.json,并package.json仅用于验证没有不匹配的版本.如果缺少任何依赖项或具有不兼容的版本,则会引发错误.
使用npm install添加新的依赖,并更新项目的依赖.通常在拉动更新依赖列表的更改之后在开发期间使用它,但npm ci在这种情况下使用可能是个好主意.
使用npm ci如果你需要一个确定的,可重复的构建.例如,在持续集成,自动化作业以及第一次安装依赖项时,而不是npm install.
npm installnpm-shrinkwrap.json和package-lock.json(按此顺序)驱动.node_modules.package.json或package-lock.json.
npm i packagename)一起使用时,它可以写入package.json以添加或更新依赖项.npm i)package-lock.json如果它们不在此文件中,它可能会写入以锁定某些依赖项的版本.npm cipackage-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使用以下算法:
Run Code Online (Sandbox Code Playgroud)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
Adm*_*ama 28
npm ci- 准确安装 package-lock.json 中列出的内容npm install- 不更改package.json中的任何版本,使用package.json编写package-lock.json,然后准确安装package-lock.json中列出的内容npm update- 类似于npm install但也会安装“模糊版本”内容的更新(例如*,^1.2.3)npx npm-check-updates -u; npm install- 将尝试将所有内容更新到最新版本。使用这个时要小心破坏性的改变。或者换种说法,npm ci更改 0 个包文件,npm install更改npm update1 个包文件(package-lock.json),npx npm-check-updates -u; npm install更改 2 个包文件(package.json 和 package-lock.json)。
小智 14
Npm ci将删除任何现有的node_modules文件夹,并依赖于package.lock文件来安装每个软件包的特定版本.它比npm安装快得多,因为它会跳过某些功能.这是干净的状态安装非常适合ci/cd管道和docker构建!您还可以使用它一次安装所有内容而不是特定的软件包.
您链接的文档包含以下摘要:
简而言之,使用npm install和npm ci之间的主要区别是:
- 该项目必须具有现有的package-lock.json或npm-shrinkwrap.json。
- 如果程序包锁中的依赖项与package.json中的依赖项不匹配,则npm ci将退出并显示错误,而不是更新程序包锁。
- npm ci一次只能安装整个项目:此命令不能添加单个依赖项。
- 如果已经存在一个node_modules,它将在npm ci开始安装之前被自动删除。
- 它永远不会写入package.json或任何包锁:安装实际上是冻结的。
package.json这些命令在功能上非常相似,但不同之处在于安装和文件中指定的依赖项所采用的方法package-lock.json。
npm ci对应用程序的所有依赖项执行全新安装,而npm install如果系统上已存在某些安装,则可能会跳过这些安装。如果系统上已安装的版本不是您想要安装的版本,即安装的版本与“所需package.json”版本不同,则可能会出现问题。
其他区别是npm ci永远不会触及您的package*.json文件。package.json如果和文件中的依赖项版本不匹配,它将停止安装并显示错误package-lock.json。
您可以从此处的官方文档中阅读更好的解释。
此外,您可能想在此处阅读有关包锁的信息。
您应该在不同的情况下使用它们。
npm install当您想要缓存node_modules目录时,非常适合开发和 CI 。什么时候用这个?如果您正在制作供其他人使用的软件包(您不包含node_modules在此类发行版中),则可以执行此操作。关于缓存,请注意,如果您计划支持不同版本的Node.js记住,node_modules由于Node.js运行时要求之间的差异可能必须重新安装。如果您想坚持使用一个版本,请坚持使用最新的LTS.
npm ci当您要测试和发布生产应用程序(最终产品,不会被其他软件包使用)时应该使用它,因为让安装尽可能具有确定性很重要,此安装将花费更长的时间,但最终将使您的应用程序更可靠(您确实包含node_modules在这样的版本中)。坚持使用LTS的版本Node.js。
npm i并且npm ci两者都使用 npm 缓存(如果存在),该缓存通常位于~/.npm.
奖励:您可以根据您想要制作的复杂程度将它们混合。在功能分支上,git您可以缓存node_modules以提高团队生产力,并在合并请求和主分支上依赖npm ci确定性结果。
值得记住的是,像 alpine 这样的轻节点 docker 镜像没有安装 Python,这node-gyp是npm ci.
我认为为了npm ci工作,你需要在构建中安装 Python 作为依赖项,这有点固执己见。
更多信息请点击此处Docker 和 npm - gyp ERR!不好