首页
/ 在dependency-cruiser中处理monorepo中的devDependencies与dependencies冲突问题

在dependency-cruiser中处理monorepo中的devDependencies与dependencies冲突问题

2025-06-05 05:11:45作者:宣利权Counsellor

问题背景

在monorepo项目中,我们经常会遇到一个典型场景:某些依赖包既需要在根目录的devDependencies中声明(用于构建工具或配置),又需要在子包的dependencies中声明(作为运行时依赖)。这种双重声明会导致dependency-cruiser的not-dev-dep规则误报。

具体案例

假设我们有一个monorepo项目结构如下:

  • 根目录package.json:
{
  "devDependencies": {
    "foo": "1.0.0"
  },
  "overrides": {
    "foo": "$foo"
  }
}
  • packages/floof/package.json:
{
  "dependencies": {"foo": "1.0.0"}
}

当启用combinedDependencies选项时,dependency-cruiser会将所有工作区的依赖合并分析。此时foo同时出现在devDependencies和dependencies中,触发not-dev-dep规则报错。

解决方案

通过调整dependency-cruiser配置中的dependencyTypesNot数组,可以解决这个问题。具体做法是在not-to-dev-dep规则中添加npm类型:

{
  "name": "not-to-dev-dep",
  "severity": "error",
  "from": {
    "pathNot": ["^test/", "^tools/"]
  },
  "to": {
    "dependencyTypes": ["npm-dev"],
    "exoticallyRequired": false,
    "dependencyTypesNot": [
      "type-only",
      "type-import",
      "triple-slash-type-reference",
      "npm-peer",
      "npm"  // 新增这一行
    ],
    "pathNot": ["node_modules/@types/"]
  }
}

技术原理

  1. dependencyTypes定义了规则检查的依赖类型,这里设置为npm-dev表示只检查开发依赖。

  2. dependencyTypesNot定义了例外情况,新增的npm表示如果一个依赖同时是生产依赖(在dependencies中声明),则忽略该规则的检查。

  3. 这种配置确保了:

    • 如果一个包只在devDependencies中声明,但在代码中被引用,会触发警告
    • 如果一个包同时在devDependencies和dependencies中声明,不会触发警告
    • 如果一个包没有在任何地方声明,会触发警告

最佳实践建议

  1. 对于monorepo项目,建议始终启用combinedDependencies选项,以获得完整的依赖关系视图。

  2. 对于需要在根目录和子包中同时声明的依赖,可以考虑:

    • 在根目录使用peerDependencies
    • 使用workspace协议(如workspace:*
    • 采用上述配置方案
  3. 定期检查依赖关系,确保没有冗余的依赖声明。

通过这种配置方式,我们既保持了依赖关系的严格检查,又适应了monorepo项目的特殊需求,实现了开发效率和代码质量的平衡。

登录后查看全文
热门项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
138
188
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
94
15
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
187
266
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
893
529
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
371
387
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
337
1.11 K
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
401
377