Skip to content

Monorepo 核心功能实现

这是一个 Monorepo 管理工具的实现,展示了如何管理多个包。

项目结构

04-core-feature/
├── packages/
│   ├── tools/            # 管理工具
│   ├── package-a/        # 示例包 A
│   └── package-b/        # 示例包 B
├── test/
│   └── manager.test.js
├── package.json
└── README.md

核心功能

1. 包管理

管理多个包的生命周期。

功能:

  • 包发现
  • 包依赖分析
  • 包拓扑排序

2. 工作区管理

管理工作区配置。

功能:

  • 工作区解析
  • 依赖链接
  • 版本管理

3. 任务执行

在多个包中执行任务。

功能:

  • 并行执行
  • 依赖顺序
  • 任务过滤

Monorepo 的优势

开发体验

  • ✅ 统一的依赖管理
  • ✅ 跨包修改
  • ✅ 统一的构建流程

维护性

  • ✅ 代码共享
  • ✅ 版本同步
  • ✅ 统一的 CI/CD

使用方法

安装依赖

bash
npm install

运行测试

bash
npm test

执行任务

bash
npm run dev -- --scope=package-a

实现细节

包发现

递归查找包:

javascript
function findPackages(root) {
  const packages = []
  
  function traverse(dir) {
    const packageJson = join(dir, 'package.json')
    
    if (existsSync(packageJson)) {
      packages.push({
        name: readJson(packageJson).name,
        path: dir
      })
    }
    
    // 继续遍历
  }
  
  traverse(root)
  return packages
}

依赖分析

构建依赖图:

javascript
function buildDependencyGraph(packages) {
  const graph = new Map()
  
  for (const pkg of packages) {
    const deps = getDependencies(pkg)
    graph.set(pkg.name, deps)
  }
  
  return graph
}

拓扑排序

确定执行顺序:

javascript
function topologicalSort(graph) {
  const visited = new Set()
  const result = []
  
  function visit(pkg) {
    if (visited.has(pkg)) return
    
    visited.add(pkg)
    
    for (const dep of graph.get(pkg) || []) {
      visit(dep)
    }
    
    result.push(pkg)
  }
  
  for (const pkg of graph.keys()) {
    visit(pkg)
  }
  
  return result
}

应用场景

  • 组件库 - 管理多个组件
  • 微前端 - 管理多个应用
  • 工具链 - 管理相关工具
  • 企业项目 - 管理多个服务

总结

这个实现展示了 Monorepo 的核心概念和架构,包括:

  1. 包管理 - 多包生命周期管理
  2. 工作区管理 - 依赖和版本管理
  3. 任务执行 - 并行和顺序执行

通过这个实现,可以深入理解 Monorepo 的原理和管理策略。