Monorepo 描述
-
集成 ERP、WMS、云仓B端、云仓C端 于一体的单一仓库架构模式。
技术架构
Turborepo + pnpm
- Turborepo (opens in a new tab) 增量构建、并行构建、云端缓存。
- 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;
- 代码合并到需要发布的分支。
- 进入发布平台 (opens in a new tab),选择发布项目、分支、服务器IP
开发命令
# 启动全部项目
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}`);