Skip to content

使用Turborepo、Pnpm、Changesets实践Monorepo

前言

一般在一些ui组件库中,会使用Monorepo的方式来管理项目,比如antdelement-uivant等。这样做的好处是,可以方便的进行组件的复用,以及版本的管理。在pnpm还未流行之前,使用lerna来管理Monorepo项目,但是lerna的性能问题一直被人诟病,所以后来出现了yarnpnpmTurborepo等工具来解决这个问题。这里就用TurborepoPnpmChangesets来实践Monorepo项目。

创建项目

使用以下命令创建项目

bash
pnpm dlx create-turbo@latest

执行之后会提示你输入项目名称,然后会自动创建项目。 create-turbo

进入项目目录,执行以下命令,启动项目

bash
pnpm dev

控制台会输出以下信息 web

docs

从图中可以看出,项目已经创建成功,并且已经启动了两个项目,分别是webdocs。然后浏览器就可以访问了对应的url

项目结构

bash
// tree -L 3 -I 'node_modules|.git|.next|dist'
.
├── README.md
├── apps
   ├── docs
   ├── README.md
   ├── app
   ├── eslint.config.js
   ├── next-env.d.ts
   ├── next.config.js
   ├── package.json
   ├── public
   └── tsconfig.json
   └── web
       ├── README.md
       ├── app
       ├── eslint.config.js
       ├── next-env.d.ts
       ├── next.config.js
       ├── package.json
       ├── public
       └── tsconfig.json
├── package.json
├── packages
   ├── eslint-config
   ├── README.md
   ├── base.js
   ├── next.js
   ├── package.json
   └── react-internal.js
   ├── typescript-config
   ├── base.json
   ├── nextjs.json
   ├── package.json
   └── react-library.json
   └── ui
       ├── eslint.config.mjs
       ├── package.json
       ├── src
       ├── tsconfig.json
       └── turbo
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
└── turbo.json

turbo.json配置文件

json
{
  "$schema": "https://turbo.build/schema.json",
  "ui": "tui",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "inputs": ["$TURBO_DEFAULT$", ".env*"],
      "outputs": [".next/**", "!.next/cache/**"]
    },
    "lint": {
      "dependsOn": ["^lint"]
    },
    "check-types": {
      "dependsOn": ["^check-types"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

tasks 是任务的配置,可以自定义任务,比如buildlintcheck-typesdev等。如果执行turbo dev,就会执行dev任务。会把在package.json中配置的dev任务执行。其他同理。

pnpm-workspace.yaml配置文件

yaml
packages:
  - 'apps/*'
  - 'packages/*'

这个配置文件是用来指定哪些目录下的包会变成monorepo的包。

安装changesets

bash
pnpm add -Dw @changesets/cli

初始化changesets

bash
pnpm changeset init

init 当做了修改之后,需要使用以下命令生成changeset

bash
pnpm changeset

update 然后执行以下命令,生成版本和更新日志

bash
pnpm changeset version

version

log 执行之后会生成一个版本号,然后会生成一个changeset文件,然后会自动提交到git仓库。然后执行以下命令,发布版本

bash
pnpm  publish

总结

通过以上步骤,我们就完成了使用Turborepo、Pnpm、Changesets实践Monorepo项目。比较方便的实现了分包和npm包的发布,可以接和father或者ice pkg的npm等打包工具来进行发包流程优化

如有转载或 CV 的请标注本站原文地址