pnpm + workspace 构建monorepo 工程

249 阅读1分钟

Monorepo

Monorepo 是一种项目代码管理方式,指单个仓库中管理多个项目,有助于简化代码共享、版本控制、构建和部署等方面的复杂性,并提供更好的可重用性和协作性,Monorepo 提倡了开放、透明、共享的组织文化

主流包管理

  • pnpm 新一代node 包管理器
  • lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目

指令

pnpm 常用指令

子包管理

  • 指定 pkgA子包安装 lodash;-S 和 -D 选项分别可以将依赖安装为正式依赖(dependencies)或者开发依赖(devDependencies)
 pnpm --filter pkgA i -S lodash-es  
 pnpm --filter pkgA i -D lodash-es  
  • 指定A子包安装内部依赖 B子包
pnpm --filter pkgA i -S pkgB

公共依赖全局安装

pnpm install @types/node -wD
  • 在子项目 package.json文件中 声明使用公共依赖
"peerDependencies": { "@types/node": "*", }

workspace

目录结构

├── packages
    ├── pkgA
│   │   ├── src
│   │   │   └── index.ts
│   │   ├── package.json
│   │   └── tsconfig.json
│   └── pkgB
│       ├── src
│       │   └── index.ts
|       ├── package.json
│       └── tsconfig.json
├── pnpm-workspace.yaml
├── package.json
└── tsconfig.root.json
├── README.md

pnpm-workspace.yaml指定工作空间的目录

packages:
  - 'packages/*'

在项目根目录下的 package.json 中配置启动脚本

# @motorepo/pkgA 是pkgA包package.json中name
# @motorepo/pkgB 是pkgB包package.json中name
"scripts": {
    "dev:a": "pnpm -r --filter @motorepo/pkgA run dev", 
    "build:b": "pnpm -r --filter @motorepo/pkgB run dev" 
},

Release工作流