如何在PR阶段严格强制执行npm peer dependencies?
针对你在npm monorepo里遇到的问题——想强制严格执行peer依赖,但用户能用--legacy-peer-deps等标志绕过,目前没有直接的npm命令能一键确认用户是否用过绕过标志,但可以通过以下几种方式间接验证:
1. 利用package-lock.json做一致性校验
npm的lock文件会完整记录安装时的依赖处理策略。你可以在全新检出的仓库(保留lock文件)直接运行:
npm install --strict-peer-deps
如果之前的install是用绕过标志完成的,这次会直接触发peer依赖冲突报错。因为严格模式下,npm会校验lock文件里的依赖版本是否符合所有peer依赖规则,绕过标志生成的lock文件大概率存在不兼容的版本匹配,过不了严格校验。
2. 用npm ls快速检查依赖树
运行:
npm ls --strict-peer-deps
这个命令不需要重新安装,会直接基于当前的node_modules和lock文件,以严格模式检查整个依赖树。如果存在因绕过标志导致的peer依赖不兼容,会立刻输出具体的冲突信息。
3. 从流程上强制严格安装
在项目根目录的package.json里添加固定脚本:
{ "scripts": { "install": "npm install --strict-peer-deps" } }
这样用户直接跑npm install时会自动启用严格模式,除非他们手动指定其他绕过标志。同时在CI流程里强制执行npm install --strict-peer-deps,只要lock文件是用绕过标志生成的,CI就会失败,从源头阻止不符合规范的依赖提交。
4. 确认.npmrc配置生效
先确保项目根目录的.npmrc已经设置:
strict-peer-deps=true
然后运行npm config get strict-peer-deps查看当前生效的配置值,确认是否为true——避免用户本地的.npmrc覆盖了项目配置。
至于你提到的全新检出环境验证:即使不删除package-lock.json,只要项目.npmrc开启了strict-peer-deps=true,运行npm install时如果lock文件是通过绕过标志生成的,npm会因为依赖版本不符合严格peer规则而报错,这时候就能判断之前的安装没有严格执行peer依赖。
内容的提问来源于stack exchange,提问作者Cheetah

