什么是 monorepo

使用 Yarn Workspace

1. 初始化项目

新建文件夹,运行 yarn init,可以看到生成了一些文件。主要看 package.json

{
  "name": "monorepotest",
  "packageManager": "yarn@3.3.0"
}

切换 yarn 的版本至 yarn 2:yarn set version berry,此时会在项目目录里生成一个 .yarn 文件夹,目录结构如下:

└───.yarn
    └───releases
            yarn-3.3.0.cjs

如果你的网不好,可以设置 yarn 使用代理服务器(前提是你得有个代理服务器。)

yarn config set httpProxy http://host:port
yarn config set httpsProxy https://host:port

2. monorepo 项目结构

新建 packages 目录(或者其他任意名称),用来放子项目。在 package.json 文件中添加一行。

"workspaces": ["packages/*"],

这一行的作用是告诉 yarn 你的子项目有哪些。当然你也可以在这个数组里面写每一个子项目的相对路径。

如果项目目录下没有 .yarnrc.yml 就新建一个,这是这个项目里面 yarn 的配置文件。
yarn 默认使用的 nodeLinkerpnp,不过这玩意在我跑 vue3 + element-plus 项目的时候跑不起来,报了一堆错误 Could not resolve "@vue/xxx",最后还是改回了 node-modules

# .yarnrc.yml 加一行
nodeLinker: node-modules

3. 安装 yarn workspaces 插件

yarn plugin import workspace-tools

这个插件增加了两个管理 workspaces 的命令,很好用。

4. 子项目间的依赖

创建一个 vue 项目和一个 js/ts 项目。

└───packages
    ├───pure-ts
    └───vue-project

其中 pure-ts 项目运行了 yarn init 就行了。其中的文件如下:

└───pure-ts
    │   package.json
    │   README.md
    │
    └───say
            index.ts

say/index.ts 里的代码:

export function world() {
    console.log('hello world!')
}

如果 vue-project 项目需要引用 pure-ts,修改 vue-project/package.json,在 dependencies 里添加一个依赖:"pure-ts": "workspace:*"
workspace:* 的意思可以看yarn 官方文档,* 号的大致意思是在打包时自动在 workspace 中找对应的版本。你也可以指定某个打包发布的版本,比如说 "workspace:^1.2.3"

再执行 yarn installyarn 之后,你就可以在 vue-project 中愉快的使用 pure-ts 了。

import { world } from "pure-ts/say"
world()

5. 打包

还记得我们装的 workspace-tool 插件吗?打包所有的子项目用的就是这个插件提供的命令。

yarn workspaces foreach run build

前提是要打包的项目的 package.json 里要有 build script。
还可以把这个命令写到项目根目录的 packages.json 里:

"scripts": {
    "build": "yarn workspaces foreach run build"
}

2022-12-05