使用yarn workspace搭建简单的monorepo项目

前段时间上级主管提出开发过程中使用yarn workspace,之前对其并没有什么了解,对该功能也没有多少热情。知道这两天有同事问我使用yarn workspace管理多个项目,可能会导致项目启动出现问题,经过检查及上网检索大致可以确定是依赖版本的问题导致,就此机会大概了解一下yarn workspace,做点笔记如下:

yarn workspace

多个包互相引用

我们在根目录monorepo中使用yarn工作空间,在monorepo目录下执行yarn init -y生成package.json。新建文件夹packages管理所有的项目

目录如下:

| monorepo

| – | package.json

| – | packages

在packages.json配置如下:

1
2
3
4
5
6
7
8
9
{
"name": "monorepo",
"version": "1.0.0",
"license": "MIT",
"private": true,
"workspaces": [
"packages/*"
]
}

指定packages目录下所有的都是我们管理的包。

假设我们有两个包分别为package_a和package_b,在两个目录下分别yarn init -y,生成配置文件,进行配置。指定入口文件都为index.js,在b包中引入a包并执行install。

目录如下:

| monorepo

| – | package.json

| – | packages

| – | – | package_a

| – | – | – | package.json

| – | – | – | index.js

| – | – | package_b

| – | – | – | package.json

| – | – | – | index.js

代码如下:

包名一般以 父级名称/包名称 命名

1
2
3
4
5
6
7
// /monorepo/packages/package_a/package.json
{
"name": "@monorepo/package_a",
"version": "1.0.0",
"main": "index.js",
"license": "MIT"
}
1
2
// /monorepo/packages/package_a/index.js
console.log('this is package a')
1
2
3
4
5
6
7
8
9
10
11
// /monorepo/packages/package_b/package.json
{
"name": "@monorepo/package_b",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
// 由于包没有发布,所以需要手动在这里添加包,而不能yarn add
"@monorepo/package_a": "1.0.0"
}
}
1
2
3
// /monorepo/packages/package_b/index.js
require('@monorepo/backage_a')
console.log('this is package b')

在package_b中执行yarn install之后执行node index.js,可以看到如下内容:

1
2
this is package a
this is package b

说明package_a被成功引入到package_b中了

要注意的是,由于使用了工作空间,所以node_modules在monorepo目录下,也就是monorepo下边的包可以共用这些依赖

假设我们前后端全部使用ts进行开发,我们对api的一些类型约束在前后端都能用到,我们就可以把所有的接口定义为一个包,这样就可以在前后端代码中引入接口这个包来使用,当然要记得将decleration设置为true生成.d.ts的声明文件

1
2
3
4
5
6
7
8
9
10
11
12
// /monorepo/packages/interface/package.json
// 我们要对tsconfig进行配置,生成声明文件,假设将文件编译到dist目录下:
{
"name": "@monorepo/interface",
"version": "1.0.0",
"main": "dist/index.js", // 入口文件
"types": "dist/idnex.d.ts", // 类型声明
"license": "MIT",
"script": {
"build": "tsc"
}
}

管理的项目使用不同版本的依赖

需要在monorepo目录下的package.json进行配置,在nohoist中配置的依赖则不会被安装到monorepo目录下的node_modules中,而是会安装到具体某一个项目的目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// /monorepo/package.json
{
"name": "monorepo",
"version": "1.0.0",
"license": "MIT",
"private": true,
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/bootstrap"
]
}
}

假设如上配置之后,在某一个包中进行yarn add bootstrap之后不会在根目录的node_modules中安装bootstrap,而会在我们安装命令所在的包中安装这个依赖

作者

胡兆磊

发布于

2022-04-12

更新于

2022-10-23

许可协议