Azure DevOps构建因废弃inflight包失败,本地正常的原因及解决办法
问题描述
我的项目package.json中的devDependencies配置如下:
"devDependencies": { "@nx/js": "18.0.4", "@nx/jest": "18.0.4", "@nx/eslint-plugin": "18.0.4", "typescript": "5.3.3", "eslint": "8.56.0", "jest": "^29.7.0", "@types/jest": "^29.5.12", "ts-jest": "29.1.2", "nx": "latest" }
本地执行npm install时无任何错误或警告,但在Azure DevOps流水线的构建环境中执行相同命令时,出现如下废弃依赖警告:
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
已知该警告和Jest的间接依赖有关,且存在已久,但另一个使用相同Jest版本的仓库在构建时却没有这个问题。
原因分析
- npm版本差异:本地和Azure DevOps环境的npm版本不一致,不同版本的npm在解析间接依赖时会选择不同的版本路径。比如本地npm可能自动避开了包含
inflight@1.0.6的依赖链,而流水线中的npm版本仍会拉取这个废弃包。 - lock文件未同步:本地已经生成
package-lock.json/npm-shrinkwrap.json锁定了依赖版本,避免拉取inflight;但流水线如果没提交lock文件,或者lock文件与流水线环境不兼容,就会重新解析依赖,导致出现废弃包。 - 依赖树差异:两个仓库虽然Jest版本相同,但其他依赖(比如NX相关包)的版本或依赖链存在差异,导致其中一个仓库的依赖路径引入了
inflight,另一个则没有。
修复/排查步骤
- 统一npm版本:在Azure DevOps流水线中先安装和本地一致的npm版本,比如执行
npm install -g npm@<你的本地npm版本>,再运行npm install。 - 提交lock文件:将本地生成的
package-lock.json提交到仓库,让流水线直接使用锁定的依赖版本,避免重新解析依赖树。 - 排查依赖链:在本地执行
npm ls inflight,找出哪个间接依赖引入了inflight@1.0.6;再去另一个无问题的仓库执行同样命令,对比差异,定位是哪个顶层依赖导致的区别。 - 升级或替换依赖:如果是某个NX包或其他依赖引入了废弃包,尝试升级该依赖到最新兼容版本,或者寻找替代方案。
- 临时屏蔽警告:若该警告不影响构建结果,可在流水线的
npm install命令后添加--no-warnings参数暂时屏蔽,但不建议长期使用此方案。
内容的提问来源于stack exchange,提问作者O. R. Mapper
相关产品推荐
相关产品推荐

