[Tools] turbo

现在的monorepo项目中,要一个个进入相关文件夹再依次去运行实在太麻烦了,我们可以使用相关工具,方便、快捷、高速的帮我们处理这个问题。Turborepo 是一个用于 monorepo 项目管理 的构建工具,它支持 任务缓存、依赖追踪、并行构建,适合管理多个前端/后端包组成的项目。

其实基本的道理很简单,我们现在的最基本的痛点是运行管理起来太麻烦,turbo工具可以帮我们直接在根目录,根据workspace路径,索引到相关命令,帮我们运行,而且还有相关的缓存处理。

所以,最基本的要求:在pnpm-workspace.yaml每个路径,比如 apps/*packages/* 中的 package.json 都要有标准的 scripts,这样才能精准的进行索引

也就是说你想一键的打包packages下面的包,那么packages路径下package.json中最好有统一的打包脚本命令,而且最好不要和其他外部包命令重名,比如,我们的脚本如下:

"scripts": {
  "build:watch": "pnpm run build:watch:transpile & pnpm run build:watch:types",
  "build:watch:transpile": "tsup --watch",
  "build:watch:types": "tsc -p tsconfig.types.json --watch",
  "build:lib": "pnpm run build:transpile & pnpm run build:types",
  "build:transpile": "tsup",
  "build:types": "tsc -p tsconfig.types.json"
},

注意:之前的build脚本命令我改了一个名字,build:lib目的是为了和其他外部的一些脚本命令进行区分

我们在根目录引入turbo

pnpm add turbo -D --workspace-root

根目录下创建turbo.json文件

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build:watch": {
      "cache": false,
      "persistent": true
    },
    "build:lib": {
      "outputs": ["build/**/*"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    },
    "start:dev": {
      "dependsOn": ["^start:dev"],
      "outputs": ["dist/**/*"],
      "cache": false,
      "persistent": true
    },
    "build:server": {
    	"outputs": ["dist/**/*"]
    }
  },
  "ui": "tui",
  "cacheDir": ".turbo/cache"
}

这里的build:watchbuild:libdevstart:devbuild:server相当于就是turbo定义的任务,我们还需要在根目录的package.json中定义相关脚本任务

build:libbuild:server为了方便启动,都是分别给库代码中加入了build:lib脚本,给backend代码中加入了build:server脚本,免得因为同名的问题而困扰

"scripts": {
  "build:watch": "turbo build:watch",
  "build:lib": "turbo build:lib",
  "build:server": "turbo build:server",
  "start": "turbo start:dev",
  "dev": "turbo dev",
},

turbo就会自动的在整个项目中匹配对应的脚本命令,并且还会保存相应的缓存信息,下次再次执行的时候,效率就会相当的高。

caddy

Caddy 是一个现代的 Web 服务器(和反向代理服务器),和 Nginx 属于同一类工具。

  • Caddy配置文件简单直接,可读性高,
  • 本地开发体验更好,你可以直接让 Caddy 代理多个服务,开箱即用
  • 部署快速简单,单文件可执行,适合容器、轻量服务部署
  • Caddy 一行配置搞定https,只要在配置文件顶部写上你的域名Caddy 就会自动帮你向 Let’s Encrypt 申请证书,并配置好 TLS,自动监听 443 端口,自动续期证书

我们还是直接在容器中安装caddy,为了好安装/卸载caddy,我们单独配置一个可执行文件,运行docker命令,还是在.dccontainer文件夹下创建caddy文件夹,创建restart.sh文件

docker run -d \
  --name monitor-caddy \
  --restart always \
  -p 3060:80 \
  -p 443:443 \
  caddy:2.10.0

编写一个 shell 脚本之后,默认这个文件可能没有执行权限

查看文件状态

ls -la

给文件 restart.sh 添加执行权限

chmod +x restart.sh

chmod:是 change mode 的缩写,用于改变文件或目录的权限。

+x:意思是 添加可执行权限(x = execute)。

restart.sh:是目标文件名,通常是一个 Shell 脚本。

现在已经可以启动并运行caddy服务器了。

不过我们需要将自己的前端代码给挂载到服务器上,并且我们的前端代码里面还有之前开发阶段配置的访问后端api的代理,这些我们都需要经过caddy的反向代理配置才行,所以我们创建Caddyfile配置文件,把前端打包好的文件,复制粘贴到当前目录下方便访问。restart.sh重新配置一下,加入配置文件和代码文件的映射。注意,这一步配置之后,我们需要删除原来的容器,重新安装一下才行

docker run -d \
  --name monitor-caddy \
  --restart always \
  -p 3060:80 \
  -p 443:443 \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -v ./dist:/data \
  caddy:2.10.0

配置Caddyfile文件:

:80 {
  handle /api/* {
    reverse_proxy 192.168.50.91:3030
  }

  handle_path /dsn-api/* {
    reverse_proxy 192.168.50.91:3000
  }

  uri strip_suffix /

  root * /data

  handle {
    templates
    try_files {path} /index.html
    file_server
  }
}

其中,如果我们有域名,就将:80替换为我们自己的域名即可,handle /api/*配置主要是由于我们/api前缀是存在的,handle_path /dsn-api/*这个/dsn-api是需要去掉的,不需要配置caddy会自动帮我们处理

mac查看IP地址:

ifconfig | grep "inet " | grep -v 127.0.0.1

进入docker容器内部查看:

docker exec -it monitor-caddy sh

当我们输入命令

vi /etc/caddy/Caddyfile

可以看到外部的命令直接映射进来了

进入/data,外部dist目录中的内容也映射进来了

现在我们在浏览器上输入localhost:3060就能直接访问到具体的前端页面了

pm2

后端的项目要运行,当然也是启动打包之后的结果,不过每次还需要自己手动node dist/main.js这个不现实,并且程序挂了就挂了,没人帮你重启

我们Nest.js的项目还有一个问题是,并没有把全部的库文件帮我们打包,在打包文件中你还会发现这样的代码:require("@nestjs/core");。也就是说我们还要手动的去下载node_modules

PM2 是一个功能强大的 Node.js 应用进程管理工具,它主要解决两个问题

  1. 进程守护
  2. 进程管理与监控

PM2 可以让你的 Node.js 应用在后台持续运行,哪怕终端关闭或者程序崩溃,它都能自动重启,保持服务“永不宕机”。

PM2 还提供了一整套命令和可视化工具来查看服务状态、资源占用、日志等,非常方便开发和运维。

所以,我们直接使用pm2帮我们处理这些问题,首先当然还是安装,直接在项目根目录局部安装pm2

 pnpm add pm2 -D --workspace-root

生成配置文件:

npx pm2 ecosystem

我们在配置文件中配置相关的要运行的后端代码即可

module.exports = {
  apps: [{
    name: "dsn-server",
    script: './apps/backend/dsn-server/dist/main.js',
  }, {
    name: "monitor-server",
    script: './apps/backend/monitor-server/dist/main.js',
  }]
};

当然上面只是一个最简单的配置,其他内容可以去查看pm2官网

然后我们就可以直接运行了

npx pm2 start ecosystem.config.js
posted @ 2025-08-18 14:24  Zhentiw  阅读(29)  评论(0)    收藏  举报