Skip to content

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(你自己的项目名称)