Lerna 也可以用来管理 Monorepo,并且它提供了类似于 Nx 的功能,用于管理多个项目或模块。在使用 Lerna 作为 Monorepo 管理工具时,你依然可以搭建一个包含 Next.js 和 NestJS 的项目,并能够轻松地共享代码和管理依赖。Lerna 是一个用于 JavaScript 项目(特别是 Node.js 项目)的工具,它可以帮助你在同一个仓库中管理多个包(package)。
下面是如何使用 Lerna 来搭建一个包含 Next.js 和 NestJS 的 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.js
和 NestJS
应用
接下来,我们创建
Next.js
和 NestJS
应用。我们将每个应用作为独立的包(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 在前端和后端中引用共享库
然后,你可以在
frontend
和 backend
中引用 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. 安装和配置第三方库
你可能需要安装一些第三方库(例如 Axios、TypeORM、Redis 等)。你可以为每个应用单独安装依赖,或者使用 Lerna 来统一安装和管理。
5.1 安装 Axios
在 frontend 和 backend 中都可能需要使用 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.js 和 NestJS 应用:
# 启动 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.js 和 NestJS)。Lerna 提供了模块化管理、共享库、依赖管理等多种功能,极大地提高了团队开发和代码维护的效率。整个过程包括了以下步骤:
- 初始化 Lerna 工作区并创建
Next.js
和NestJS
应用。
- 创建共享库以便在前后端之间共享代码。
- 安装和管理第三方库。
- 使用 Lerna 管理项目依赖和版本。
- 配置 CI/CD 自动化构建和部署。
通过这种方式,你可以在 Monorepo 中高效地管理和部署前后端应用,并享受共享代码和简化的依赖管理带来的优势。