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 的原理和管理策略。