Angular5项目package-lock.json依赖导致构建失败的最优解决方法问询
问题根源
直接手动修改package-lock.json属于不符合npm版本管理规则的操作,不仅会被后续npm install执行时根据package.json的版本约束覆盖修改内容,还可能引发依赖链版本冲突,且单次修改单个依赖无法覆盖全量依赖的安全扫描要求,才会出现修复一个又触发另一个的问题。
最优解决方案
1. 先对齐环境、清理历史缓存
首先确保本地npm源和构建服务器使用的JFrog私有源完全一致,避免本地拉取公网版本、构建时拉取JFrog内被拦截的风险版本。之后执行命令清理本地缓存文件:
# Mac/Linux rm -rf node_modules package-lock.json # Windows rmdir /s /q node_modules && del package-lock.json
2. 全量排查风险依赖、统一配置版本约束
不要单独修改lockfile,所有版本变更全部通过package.json控制:
- 执行
npm audit命令排查所有存在高危风险的依赖,区分直接依赖和间接依赖 - 直接依赖:直接修改
package.json中对应依赖的版本号,选择符合JFrog安全要求、且兼容Angular 5的最高稳定版本 - 间接依赖(即业务代码未直接引入、由其他依赖嵌套引入的风险包):在
package.json中新增overrides字段(npm 8.3.0及以上版本支持,低版本npm可使用resolutions字段配合npm-force-resolutions工具),强制所有依赖链使用安全版本,示例配置如下:
{ "name": "your-angular-project", "dependencies": { // 原有直接依赖配置 }, "overrides": { // 示例:强制所有依赖使用无高危漏洞的lodash 4.17.21版本 "lodash": "^4.17.21", // 按JFrog扫描结果添加所有风险依赖的安全版本配置 "其他风险包名": "安全版本号" } }
3. 本地验证后提交生成的lockfile
配置完成后执行npm install,由npm自动生成全新的package-lock.json,之后本地执行完整的构建命令、单元测试、E2E测试,确认功能无兼容性问题后,再将package.json和新生成的package-lock.json一同提交。
4. 新增CI前置卡点避免后续问题
在合并到master分支的CI流程中新增两个前置校验步骤,不通过则禁止合并:
- 执行
npm audit --audit-level=high,存在高危漏洞直接拦截 - 对接JFrog的依赖安全扫描能力,提前校验依赖是否符合仓库安全规则,避免合并后构建失败
注意事项
- 绝对禁止手动修改
package-lock.json,所有版本调整必须通过package.json配置完成,保证lockfile的版本约束和package.json完全一致 - 升级依赖时注意版本兼容性,Angular 5属于较老的版本,请勿跨大版本升级核心生态依赖,避免出现API不兼容问题
问题相关截图


内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

