如何在npm workspaces发布子包时强制依赖合规性检查?
解决方案
针对你用npm workspaces管理monorepo时,子包依赖缺失导致发布失败的问题,以下几种方法可以检测并阻止子包使用自身未声明的外部依赖,不需要依赖lerna:
1. 使用pkg-check工具
这是专为monorepo设计的依赖检查工具,能自动遍历子包,对比代码实际使用的依赖与子包package.json的声明:
- 安装:
npm install pkg-check --save-dev - 在根目录
package.json添加脚本:"scripts": { "check-deps": "pkg-check packages/*" } - 运行检查:
npm run check-deps
子包中未声明的依赖会被直接列出,包含对应的文件位置。
2. 用dependency-check做精确扫描
该工具会扫描代码中的require/import语句,与当前包的package.json依赖做比对:
- 安装:
npm install dependency-check --save-dev - 在根目录
package.json添加批量检查脚本:"scripts": { "check-package-1": "dependency-check packages/package-1/**/*.ts --missing", "check-package-2": "dependency-check packages/package-2/**/*.ts --missing", "check-all-packages": "npm run check-package-1 && npm run check-package-2" } - 运行后,子包中未声明的依赖会直接触发报错提示。
3. 用npm发布干运行提前验证
npm自带的publish --dry-run会模拟发布流程,包含依赖完整性检查:
- 进入子包目录:
cd packages/package-1 - 运行干发布:
npm publish --dry-run
如果子包依赖缺失,npm会抛出类似Missing required dependencies: xxx的错误,及时提醒补全依赖。
4. 配置ESLint的import/no-extraneous-dependencies规则
放弃eslint-plugin-workspaces,改用eslint-plugin-import的核心规则实现检查:
- 安装依赖:
npm install eslint-plugin-import --save-dev - 在子包的
.eslintrc.json(或根目录ESLint配置中针对子包做override)添加规则:{ "rules": { "import/no-extraneous-dependencies": [ "error", { "packageDir": "./" } ] } }
将packageDir设为子包自身目录后,ESLint会以子包的package.json为基准,检测到未声明的依赖时直接报错。
内容的提问来源于stack exchange,提问作者tdesero
相关产品推荐
相关产品推荐

