Nest 使用 monorepo 管理多项目
nest 微服务架构
必须使用 monorepo 管理这样可以统一版本依赖
这样多项目使用共用的仓库 方便代码提交
架构
- 项目结构
bash
├── apps
│ ├── 项目一 名称
│ │ ├── src
│ │ ├── test
│ │ ├── nest-cli.json
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── README.md
│ ├── 项目二 名称
│ │ ├── src
│ │ ├── test
│ │ ├── nest-cli.json
│ │ ├── package.json
│ │ ├── tsconfig.json
│ │ └── README.md
├── ....流程
(1) 创建一个新的项目
bash
nest new test1(项目一名称)- 然后进入目录里面,在控制器里面增加个方法(我这里就是测试案例,你写你自己的)
ts
import { Controller, Get } from "@nestjs/common";
import { AppService } from "./app.service";
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get("test1publilc")
getTest1Public(): string {
return "test1public";
}
}- 在 main.js 中改变下端口号 把 3000 改成 3001
ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3001);
}
bootstrap();(2) 创建第二个新的项目
- 这个最重要命令变成下面的了
bash
nest g app test2(项目二名称)- 然后 进入目录里面,在控制器里面增加个方法(我这里就是测试案例,你写你自己的)
ts
import { Controller, Get } from "@nestjs/common";
@Controller()
export class Test2Controller {
constructor() {}
@Get("test2publilc")
getTest1Public(): string {
return "test2public";
}
}启动项目
在根目录下执行
- 启动主项目
bash
npm run start:dev访问
bash
http://localhost:3001/test1publilc启动第二个项目
bash
npm run start:dev test2(你自己的项目名称)访问
bash
http://localhost:3000/test2publilc总结
这样两个项目就分开了.但是共用一个仓库.如果是微服务模块拆分.这个架构最合适
读取公共资源
- 各个项目有的使用公共资源
(1) 创建模块
- 记住是 lib 名字不能改
bash
nest g lib lib1- 这个时候他会问你起什么别名,这里千万不要改,不然会报错
直接输入 @app
bash
@app(2) 写个测试案例
- 在 lib1.service.ts
ts
import { Injectable } from "@nestjs/common";
@Injectable()
export class Lib1Service {
getpubliclib() {
return "public lib1";
}
}然后每个项目里面引用
test1 项目
app.module.ts
增加引用 Lib1Module
ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { Lib1Module } from "@app/lib1";
@Module({
imports: [Lib1Module],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}- app.controller.ts
ts
import { Controller, Get } from "@nestjs/common";
import { AppService } from "./app.service";
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get("test1publilc")
getTest1Public(): string {
return this.appService.getHello();
}
}- app.service.ts
ts
import { Inject, Injectable } from "@nestjs/common";
import { Lib1Service } from "@app/lib1";
@Injectable()
export class AppService {
@Inject()
private readonly lib1Service: Lib1Service;
getHello(): string {
return this.lib1Service.getpubliclib();
}
}test2 项目
- 也同 test1 项目 我就不在写了
总结
这样两个项目都能使用公共资源项目了
- 启动不同的项目
bash
npm run start:dev
访问 http://localhost:3001/test1publilc- 启动第二个项目
bash
npm run start:dev test2
访问 http://localhost:3000/test2publilc打包
(1) 最重要删除旧版本的 dist
(2) 打公共资源的包
bash
npm run build lib1(3) 打主包
bash
npm run build(4) 打第二个项目
bash
npm run build test2(你自己的项目名称)