Monorepo-pnpm
目录结构
.
├── README.md
├── package.json
├── packages
│ ├── pkg1
│ │ ├── package.json
│ │ ├── src
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ └── pkg2
│ ├── package.json
│ ├── src
│ │ └── index.ts
│ └── tsconfig.json
├── apps
│ ├── app_xxxx
│ │ ├── package.json
│ │ ├── src
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ └── app_xxxx
│ ├── package.json
│ ├── src
│ │ └── index.ts
│ └── tsconfig.json
├── pnpm-workspace.yaml
└── tsconfig.root.json
- package会被其他package依赖,也会被不同app依赖
- app只能依赖package,但不能被其他任何package或者app依赖
初始化
pnpm init
# 使用ts来对层级目录进行管理,简化引用关系
pnpm install typescript -D -w
pnpm tsc --init
tsconfig.json
{
"compilerOptions": {
"outDir":"dist", // 输出的目录
"sourceMap": true, //采用sourcemap
"target": "es2016", // 目标语法
"module": "esnext", // 模块格式
"moduleResolution": "node", // 模块解析
"strict": false, // 严格模式
"resolveJsonModule": true, // 解析json模块
"esModuleInterop": true,// 允许通过es6语法引入commonjs模块
"jsx":"preserve",// jsx不转义
"lib":["esnext","dom"],// 支持的类库esnext及dom
"baseUrl": ".",// 当前是以该路径进行查找
"paths":{
// "@manage/*":[ // 即以@manage开头的都去该路径下查找,是个数组
// "packages/*/src",
// ],
"@manage/shared/components":["packages/shared/components"],
"@manage/shared/utils":["packages/shared/utils"],
"@manage/shared/fetch":["packages/shared/fetch"],
"@manage/shared/styles":["packages/shared/styles"],
// 或者用*号处理匹配
"@manage/shared/*":["packages/shared/*"]
}
}
}
pnpm-workspace.yaml
# 1、创建 pnpm-workspace.yaml
packages:
- 'packages/*' # 代表所有项目都放在packages文件夹之下
.npmrc
# 已有多个项目的情况下添加monorepo模式
shamefully-hoist = true # 安装的依赖会扁平化到同一层级
# 全项目
node-linker=hoisted
依赖安装
全局
pnpm install vue -w
pnpm install typescript -w -D
局部
pnpm install vue -w
执行scripts
# 需要确定web1项目中的package.json中存在scripts.dev:project1
pnpm run -w dev:project1
建立关联
使用了 pnpm
包管理器来安装一个名为 @manage/shared
的软件包。这个软件包位于当前工作空间(workspace
),并且是为名为 @manage/web1
的项目或模块安装的。--filter
选项用于指定只安装 @manage/web1
相关的依赖。
# 指定版本好的安装方式
pnpm install @manage/shared@workspace --filter @manage/web1
# 不指定版本号的安装方式
pnpm install @manage/shared@* --filter @manage/web1