Monorepo 之 lerna

Date
Created
Apr 8, 2025 10:22 AM
Descrption
好记性不如烂笔头
Tags
前端工程化
工具
notion image
Lerna 也可以用来管理 Monorepo,并且它提供了类似于 Nx 的功能,用于管理多个项目或模块。在使用 Lerna 作为 Monorepo 管理工具时,你依然可以搭建一个包含 Next.jsNestJS 的项目,并能够轻松地共享代码和管理依赖。Lerna 是一个用于 JavaScript 项目(特别是 Node.js 项目)的工具,它可以帮助你在同一个仓库中管理多个包(package)。
下面是如何使用 Lerna 来搭建一个包含 Next.jsNestJS 的 Monorepo,并且配置好相关依赖的步骤。

1. 初始化 Lerna 项目

首先,确保你已经安装了 Lerna。你可以通过 npm 或 yarn 来安装 Lerna。
# 全局安装 Lerna npm install -g lerna # 或者使用 Yarn yarn global add lerna

2. 创建 Lerna 工作区

在创建 Lerna 项目之前,我们首先创建一个空的目录来初始化它。
# 创建一个新的文件夹并进入该文件夹 mkdir my-monorepo cd my-monorepo # 初始化 Lerna 工作区 lerna init
这将在 my-monorepo 文件夹中创建如下结构:
my-monorepo/ ├── packages/ ├── lerna.json ├── package.json └── node_modules/
  • packages:包含所有项目或模块的目录。
  • lerna.json:Lerna 的配置文件。
  • package.json:主项目的配置文件。

3. 设置 Next.jsNestJS 应用

接下来,我们创建 Next.jsNestJS 应用。我们将每个应用作为独立的包(package)放在 packages 目录下。

3.1 创建 Next.js 应用

首先,在 packages 文件夹下创建 frontend 目录并初始化一个新的 Next.js 应用。
# 进入 packages 目录 cd packages # 使用 create-next-app 创建 Next.js 应用 npx create-next-app frontend

3.2 创建 NestJS 应用

同样地,在 packages 目录下创建 backend 目录并初始化一个新的 NestJS 应用。
# 进入 packages 目录 cd packages # 使用 NestJS CLI 创建 NestJS 应用 npx @nestjs/cli new backend

4. 配置共享库

Monorepo 中,我们可能会有一些前后端共享的代码,比如类型定义、接口或者常用的功能库。Lerna 可以帮助我们在 packages 中创建共享的库。

4.1 创建共享库

我们可以在 packages 目录下创建一个 shared 库,专门用于存放共享代码。
# 创建共享库目录 mkdir packages/shared cd packages/shared # 初始化共享库的 package.json npm init -y
shared 库中,你可以创建共享的类型、常用函数等。例如,我们可以创建一个 types.ts 文件来共享前后端通用的接口定义:
// packages/shared/src/types.ts export interface User { id: string; username: string; email: string; }

4.2 在前端和后端中引用共享库

然后,你可以在 frontendbackend 中引用 shared 库。例如,在 frontend 中:
// packages/frontend/pages/api/user.ts import { User } from '@my-monorepo/shared'; const user: User = { id: '1', username: 'john_doe', email: 'john@example.com', }; export default user;
同样,在 backend 中使用共享库:
// packages/backend/src/user/user.service.ts import { Injectable } from '@nestjs/common'; import { User } from '@my-monorepo/shared'; @Injectable() export class UserService { private readonly users: User[] = []; getUsers(): User[] { return this.users; } }

5. 安装和配置第三方库

你可能需要安装一些第三方库(例如 AxiosTypeORMRedis 等)。你可以为每个应用单独安装依赖,或者使用 Lerna 来统一安装和管理。

5.1 安装 Axios

frontendbackend 中都可能需要使用 Axios 进行 HTTP 请求:
# 在根目录下运行 Lerna 命令安装 Axios lerna add axios --scope=frontend --scope=backend

5.2 安装 TypeORM(用于 NestJS 后端)

如果你需要在 NestJS 后端使用 TypeORM 和数据库,可以使用以下命令安装相关依赖:
lerna add @nestjs/typeorm typeorm pg --scope=backend
然后在 backend 中配置 TypeORM 来进行数据库连接。

6. 开发和构建应用

6.1 开发应用

在开发时,你可以分别启动 Next.jsNestJS 应用:
# 启动 frontend(Next.js) cd packages/frontend npm run dev # 启动 backend(NestJS) cd packages/backend npm run start:dev

6.2 构建应用

当你准备好将应用部署到生产环境时,可以使用以下命令来构建前后端应用:
# 构建 frontend(Next.js) cd packages/frontend npm run build # 构建 backend(NestJS) cd packages/backend npm run build

7. 管理依赖和版本

Lerna 提供了强大的依赖管理功能,你可以使用 Lerna 来安装和管理所有模块的依赖,或者跨项目共享依赖。

7.1 安装所有依赖

在根目录下运行以下命令来安装所有依赖:
lerna bootstrap
lerna bootstrap 会自动为你管理项目间的依赖关系,确保每个包都正确地安装依赖,并且将共享的依赖链接到各个包中。

7.2 发布新版本

Lerna 还可以帮助你发布新版本。当你在多个包中做了更改,并且希望将这些更改发布为新的版本时,可以使用以下命令:
lerna publish

8. CI/CD 配置

你可以为 Monorepo 配置 CI/CD 来实现自动化构建、测试和部署。

8.1 GitHub Actions 配置

.github/workflows/ci.yml 文件中配置自动化工作流。你可以使用以下配置示例:
name: CI on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Setup Node.js uses: actions/setup-node@v2 with: node-version: '14' - name: Install dependencies run: | lerna bootstrap - name: Build frontend run: | cd packages/frontend npm run build - name: Build backend run: | cd packages/backend npm run build - name: Run tests run: | lerna run test

9. 总结

通过 Lerna 管理 Monorepo,你可以在一个仓库中高效管理多个应用(如 Next.jsNestJS)。Lerna 提供了模块化管理、共享库、依赖管理等多种功能,极大地提高了团队开发和代码维护的效率。整个过程包括了以下步骤:
  1. 初始化 Lerna 工作区并创建 Next.jsNestJS 应用。
  1. 创建共享库以便在前后端之间共享代码。
  1. 安装和管理第三方库。
  1. 使用 Lerna 管理项目依赖和版本。
  1. 配置 CI/CD 自动化构建和部署。
通过这种方式,你可以在 Monorepo 中高效地管理和部署前后端应用,并享受共享代码和简化的依赖管理带来的优势。