项目自述
Monorepo
ManageHub介绍

Monorepo 描述

技术架构

Turborepo + pnpm

  1. Turborepo (opens in a new tab) 增量构建、并行构建、云端缓存。
  2. Pnpm (opens in a new tab) 依赖管理

项目

ManageBub 管理系统 旨在解决多项目一致性、代码跨项目复用、统一CICD流程,提升开发效率

目录介绍

|--- .husky husky自动生成的shell脚本里面包含git钩子执行函数
|--- apps 项目
    |--- cloud-depot-b -> 云仓B端
    |--- cloud-depot-c -> 云仓C端
    |--- erp -> erp系统
        |--- env -> 环境变量配置文件夹
        |--- public
        |--- src
        |--- .dockerignore
        |--- .lintstagedrc.js
        |--- Dockerfile -> docker 配置
        |--- package.json
        |--- server.js  -> node服务文件 用于本地启动
        |--- webpack.config.js -> webpack 配置
    |--- wms -> 仓库系统
|--- packages -> 
    |--- base-components -> 组件
    |--- base-lib -> 方法
    |--- build-config -> webpack\rollup 构建配置
    |--- eslint-config -> eslint 配置
    |--- typescript-config -> ts 配置
|--- .commitlintrc.js ->
|--- .editorconfig -> 编辑器配置
|--- .gitignore ->
|--- .gitlab-ci.yml -> gitlabci配置由发布平台动态生成
|--- .npmrc -> 依赖安装配置
|--- .prettierrc.js
|--- deploy-config.yml 发布配置
|--- manage-hub-deploy.sh docker 部署脚本
|--- package.json
|--- pnpm-lock.yaml
|--- pnpm-workspace.yaml
|--- README.md
|--- turbo.json -> turbo 配置

服务部署

  • 以下只包括项目内部的配置文件说明,并且以下配置都已在项目中配置完毕,请勿修改.

  • 其他部署流程代码都在发布平台中实现.

  • 自动化部署依赖自托管的gitlab-runner平台

  • ManageHum项目跟目录中的 deploy-config.yml 文件 填写好部署服务器的地址。

# deploy-config.yml 示例配置
xxx: # 第一个apps 下的 项目
  master:
    - 127.0.0.1
  release:
    - 192.168.0.158
  develop:
    - 192.168.0.153
    - 192.168.0.148
 
xxx1: # 第二个apps 下的 项目
 master:
    - 127.0.0.1
  • apps/xxx 项目的跟目录 增加 Dockerfile 文件 (所有apps下的项目采用 docker 部署)
# dockerfile 示例配置
FROM node:16-alpine AS builder
RUN npm install -g pnpm@8.12.1 --registry=https://registry.npmmirror.com/
 
# 工作目录
WORKDIR /app
COPY package.json pnpm-lock.yaml .npmrc ./
 
COPY . .
 
#https://yeasy.gitbook.io/docker_practice/buildx/buildkit
RUN --mount=type=cache,target=/ManageHub/node_modules,id=xxx,sharing=locked \
--mount=type=cache,target=/pnpm/store,id=pnpm_cache \
pnpm install --verbose
 
# 在构建镜像中 通过 --build-arg 传递进来
ARG NODE_ENV
 
# 在容器中可以通过 process.env.XXX 访问到
ENV NODE_ENV=${NODE_ENV}
 
RUN --mount=type=cache,target=/ManageHub/node_modules,id=xxx,sharing=locked \
pnpm run build -F=xxx
 
# 启动阶段
FROM nginx:alpine AS runner
 
COPY --from=builder /app/apps/xxx/dist/ /usr/share/nginx/html/
  • manage-hub-deploy.sh 部署脚本
# $1 => docker容器名称
# $2 => docker镜像名称
# $3 => docker-hub 账号
# $4 => docker-hub 密码
# $5 => 对外端口
# $6 => docker-hub地址
docker login --username $3 --password $4 $6
# 判断容器是否存在
if docker inspect $1 >/dev/null 2>&1;
then
  # 拉取镜像
  echo "拉取镜像 ---> docker pull $2";
  docker pull $2;
  # 停止容器
  echo "停止容器 ---> docker stop $1;";
  docker stop $1;
  # 删除容器
  echo "删除容器 ---> docker rm $1"
  docker rm $1;
  # 以新镜像 启动容器
  echo "启动容器 ---> docker run -d -p $5:80 --name=$1 $2;"
  docker run -d -p $5:80 --name=$1 $2;
  # 判断是否有旧镜像
  if [[ "$(docker image ls --filter "reference=$2" --filter 'dangling=true' -q 2> /dev/null)" != ""  ]]; then
    echo "true"
    echo "有镜像----------------------- 准备删除旧镜像"
    docker image rm $(docker image ls --filter "reference=$2" --filter "dangling=true" -q)
  else
    echo "false"
    echo "没有镜像 ============="
  fi;
else
  echo "$1 ---- 容器不存在!!!  ----->  部署新机器开始";
  echo "拉取镜像 ---> docker pull $2";
  docker pull $2;
  echo "启动容器 ---> docker run -d -p $5:80 --name=$1 $2;"
  docker run -d -p $5:80 --name=$1 $2;
fi;
exit;
 

开发命令

# 启动全部项目
pnpm dev
# 构建全部项目
pnpm build
# Node启动构建全部项目
pnpm start
# eslint校验代码
pnpm list
  • base-components 业务组件库
# 本地构建
pnpm --filter @repo/base-components build
# 本地构建后上传OSS
pnpm --filter @repo/base-components build:prod
  • base-lib 工具库
# 本地构建
pnpm --filter @repo/base-lib build
 
# 本地构建后上传OSS
pnpm --filter @repo/base-lib build:prod
  • erp
# 启动项目命令前 先按照 1.2 点增加本地配置
# 1、在项目env文件夹下增加 .local.env
# 2、项目跟目录文件夹下增加service.js 文件
# 开发
pnpm dev -F=erp
# 打包
pnpm build -F=erp
# 静态启动
pnpm start -F=erp
  • wms
# 启动项目命令前 先按照 1.2 点增加本地配置
# 1、在项目env文件夹下增加 .local.env
# 2、项目跟目录文件夹下增加service.js 文件
# 开发
pnpm dev -F=wms
# 打包
pnpm build -F=wms
# 静态启动
pnpm start -F=wms
  • cloud-depot-b 与上面一致
  • cloud-depot-c 与上面一致

环境变量配置

erp
  • .env.local 不可上传git仓库
URL_API=http://192.168.0.158:9000
URL_NPI=http://192.168.0.158:5566
URL_NEW_NPI=http://192.168.0.158:5567
URL_MPI=http://192.168.0.146:9900
WS_API=http://192.168.0.158:8899
SHT_APP_ROUTE=sht
PORT=7771
wms
  • .env.local 不可上传git仓库
URL_API=http://192.168.0.147:9000
URL_NPI=http://192.168.0.148:5566
PORT=7772
cloud-depot-c
  • .env.local 不可上传git仓库
URL_API=http://192.168.0.168:9000
PORT=7775
cloud-depot-b
  • .env.local 不可上传git仓库
URL_API=http://192.168.0.168:9000
PORT=7776

service 文件

  • 本地静态资源服务器 用于测试
erp-service
const path = require('path');
const pkg = require('./package.json');
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
require('dotenv').config({ path: path.resolve(__dirname, 'env/.env.local'), override: true });
 
const app = express();
 
const devProxy = {
  '/api': {
    target: process.env.URL_API,
    pathRewrite: { '^/api': '/' },
    changeOrigin: true,
  },
  '/bpi': {
    target: process.env.URL_NPI,
    pathRewrite: { '^/bpi': '/' },
    changeOrigin: true,
  },
  '/mpi': {
    target: process.env.URL_MPI,
    pathRewrite: { '^/mpi': '/' },
    changeOrigin: true,
  },
  '/ws': {
    target: process.env.WS_API,
    ws: true,
    changOrigin: true,
    pathRewrite: {
      '^/ws': '',
    },
  },
};
 
Object.keys(devProxy).forEach(function (context) {
  app.use(context, createProxyMiddleware(devProxy[context]));
});
 
app.use(express.static('dist'));
 
app.listen(process.env.PORT);
 
console.log(`${pkg.name}: http://127.0.0.1:${process.env.PORT}`);
wms-service
const path = require('path');
const pkg = require('./package.json');
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
require('dotenv').config({ path: path.resolve(__dirname, 'env/.env.local'), override: true });
 
const app = express();
 
const devProxy = {
  '/api': {
    target: process.env.URL_API,
    pathRewrite: { '^/api': '/' },
    changeOrigin: true,
  },
};
 
Object.keys(devProxy).forEach(function (context) {
  app.use(context, createProxyMiddleware(devProxy[context]));
});
 
app.use(express.static('dist'));
 
app.listen(process.env.PORT);
 
console.log(`${pkg.name}: http://127.0.0.1:${process.env.PORT}`);