chore: 重构开发启动脚本为跨平台 dev.sh,添加 VS Code 任务配置
- 新增 dev.sh:Linux/Git Bash 通用,杀端口旧进程后启动前后端 - 新增 .vscode/tasks.json:Ctrl+Shift+B 一键重启,前后端独立终端 - 删除 restart.sh:旧 Linux 专用脚本(含硬编码路径) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
a5176016b3
commit
ae64616b89
68
.vscode/tasks.json
vendored
Normal file
68
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "启动后端",
|
||||
"type": "shell",
|
||||
"command": "bash dev.sh backend",
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"problemMatcher": {
|
||||
"pattern": { "regexp": "^(.*)$" },
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": ".",
|
||||
"endsPattern": "."
|
||||
}
|
||||
},
|
||||
"presentation": {
|
||||
"echo": true,
|
||||
"reveal": "always",
|
||||
"focus": false,
|
||||
"panel": "dedicated",
|
||||
"group": "backend"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "启动前端",
|
||||
"type": "shell",
|
||||
"command": "bash dev.sh frontend",
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"problemMatcher": {
|
||||
"pattern": { "regexp": "^(.*)$" },
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": ".",
|
||||
"endsPattern": "."
|
||||
}
|
||||
},
|
||||
"presentation": {
|
||||
"echo": true,
|
||||
"reveal": "always",
|
||||
"focus": false,
|
||||
"panel": "dedicated",
|
||||
"group": "frontend"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "重启全部",
|
||||
"dependsOn": ["启动后端", "启动前端"],
|
||||
"dependsOrder": "parallel",
|
||||
"group": { "kind": "build", "isDefault": true },
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "关闭全部",
|
||||
"type": "shell",
|
||||
"command": "bash dev.sh kill",
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "环境检查",
|
||||
"type": "shell",
|
||||
"command": "bash dev.sh check",
|
||||
"problemMatcher": []
|
||||
}
|
||||
]
|
||||
}
|
||||
80
dev.sh
Normal file
80
dev.sh
Normal file
@ -0,0 +1,80 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# 开发启动脚本 (Linux / Git Bash 通用)
|
||||
# 用法:
|
||||
# bash dev.sh backend 启动后端 (端口 9999)
|
||||
# bash dev.sh frontend 启动前端 (端口 3000)
|
||||
# bash dev.sh kill 关闭所有项目进程
|
||||
# ============================================================
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
kill_port() {
|
||||
local port=$1
|
||||
local pids
|
||||
if [ "$IS_WIN" = true ]; then
|
||||
# Windows: netstat -ano 第5列是PID
|
||||
pids=$(netstat -ano 2>/dev/null | grep ":$port" | grep "LISTENING" | awk '{print $5}' | sort -u)
|
||||
else
|
||||
# Linux: lsof 或 ss
|
||||
pids=$(lsof -ti :$port 2>/dev/null || ss -tlnp 2>/dev/null | grep ":$port" | grep -oP 'pid=\K\d+' | sort -u)
|
||||
fi
|
||||
if [ -n "$pids" ]; then
|
||||
for pid in $pids; do
|
||||
if [ "$IS_WIN" = true ]; then
|
||||
taskkill //F //PID "$pid" 2>/dev/null
|
||||
else
|
||||
kill -9 "$pid" 2>/dev/null
|
||||
fi
|
||||
echo " [KILL] PID $pid (port $port)"
|
||||
done
|
||||
else
|
||||
echo " [OK] 端口 $port 无进程"
|
||||
fi
|
||||
}
|
||||
|
||||
# 检测系统
|
||||
case "$OSTYPE" in
|
||||
msys|cygwin|win32) IS_WIN=true ;;
|
||||
*) IS_WIN=false ;;
|
||||
esac
|
||||
|
||||
case "${1}" in
|
||||
backend)
|
||||
kill_port 9999
|
||||
sleep 1
|
||||
cd "$SCRIPT_DIR/our-itam"
|
||||
echo "=== our-itam 后端启动中... 端口:9999 ==="
|
||||
mvn spring-boot:run -Dspring-boot.run.profiles=dev
|
||||
;;
|
||||
frontend)
|
||||
kill_port 3000
|
||||
sleep 1
|
||||
cd "$SCRIPT_DIR/antdv-next-admin"
|
||||
echo "=== antdv-next-admin 前端启动中... 端口:3000 ==="
|
||||
npm run dev
|
||||
;;
|
||||
kill)
|
||||
kill_port 9999
|
||||
kill_port 3000
|
||||
echo "=== 已关闭全部 ==="
|
||||
;;
|
||||
check)
|
||||
echo "SCRIPT_DIR: $SCRIPT_DIR"
|
||||
echo "IS_WIN: $IS_WIN"
|
||||
echo "mvn: $(which mvn 2>/dev/null || echo 'NOT FOUND')"
|
||||
echo "npm: $(which npm 2>/dev/null || echo 'NOT FOUND')"
|
||||
echo "node: $(which node 2>/dev/null || echo 'NOT FOUND')"
|
||||
echo "---"
|
||||
echo "pom.xml: $(ls "$SCRIPT_DIR/our-itam/pom.xml" 2>/dev/null || echo 'NOT FOUND')"
|
||||
echo "package.json: $(ls "$SCRIPT_DIR/antdv-next-admin/package.json" 2>/dev/null || echo 'NOT FOUND')"
|
||||
;;
|
||||
*)
|
||||
echo "用法: bash dev.sh [backend|frontend|kill|check]"
|
||||
echo ""
|
||||
echo " backend 启动后端 (端口 9999)"
|
||||
echo " frontend 启动前端 (端口 3000)"
|
||||
echo " kill 关闭所有项目进程"
|
||||
echo " check 检查环境"
|
||||
;;
|
||||
esac
|
||||
103
restart.sh
103
restart.sh
@ -1,103 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# ============================================================
|
||||
# 重启前后端服务,确保只有一套在运行
|
||||
# ============================================================
|
||||
|
||||
BACKEND_DIR="/data/ssd/WorkSpace/tansci/our-itam"
|
||||
FRONTEND_DIR="/data/ssd/WorkSpace/tansci/antdv-next-admin"
|
||||
LOG_DIR="/data/ssd/WorkSpace/tansci/logs"
|
||||
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
# ==================== 停止旧进程 ====================
|
||||
|
||||
echo "==> 停止旧进程..."
|
||||
|
||||
# 停止后端 (spring-boot:run)
|
||||
BACKEND_PIDS=$(pgrep -f "spring-boot:run" 2>/dev/null || true)
|
||||
if [ -n "$BACKEND_PIDS" ]; then
|
||||
echo " 停止后端 PID: $BACKEND_PIDS"
|
||||
kill $BACKEND_PIDS 2>/dev/null || true
|
||||
# 等待进程退出,最多等 30 秒
|
||||
for i in $(seq 1 30); do
|
||||
if ! pgrep -f "spring-boot:run" > /dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# 强制杀死残留
|
||||
pgrep -f "spring-boot:run" > /dev/null 2>&1 && kill -9 $(pgrep -f "spring-boot:run") 2>/dev/null || true
|
||||
echo " 后端已停止"
|
||||
else
|
||||
echo " 后端未运行"
|
||||
fi
|
||||
|
||||
# 停止前端 (vite)
|
||||
FRONTEND_PIDS=$(pgrep -f "vite.*3000" 2>/dev/null || true)
|
||||
if [ -n "$FRONTEND_PIDS" ]; then
|
||||
echo " 停止前端 PID: $FRONTEND_PIDS"
|
||||
kill $FRONTEND_PIDS 2>/dev/null || true
|
||||
for i in $(seq 1 10); do
|
||||
if ! pgrep -f "vite.*3000" > /dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
pgrep -f "vite.*3000" > /dev/null 2>&1 && kill -9 $(pgrep -f "vite.*3000") 2>/dev/null || true
|
||||
echo " 前端已停止"
|
||||
else
|
||||
echo " 前端未运行"
|
||||
fi
|
||||
|
||||
# 确保端口释放
|
||||
sleep 1
|
||||
|
||||
# ==================== 启动后端 ====================
|
||||
|
||||
echo "==> 启动后端..."
|
||||
cd "$BACKEND_DIR"
|
||||
nohup mvn spring-boot:run -Dspring-boot.run.profiles=dev > "$LOG_DIR/backend.log" 2>&1 &
|
||||
BACKEND_PID=$!
|
||||
echo " 后端 PID: $BACKEND_PID (日志: $LOG_DIR/backend.log)"
|
||||
|
||||
# ==================== 启动前端 ====================
|
||||
|
||||
echo "==> 启动前端..."
|
||||
cd "$FRONTEND_DIR"
|
||||
nohup npm run dev > "$LOG_DIR/frontend.log" 2>&1 &
|
||||
FRONTEND_PID=$!
|
||||
echo " 前端 PID: $FRONTEND_PID (日志: $LOG_DIR/frontend.log)"
|
||||
|
||||
# ==================== 等待就绪 ====================
|
||||
|
||||
echo "==> 等待服务就绪..."
|
||||
|
||||
# 等待后端 (最多 120 秒)
|
||||
for i in $(seq 1 120); do
|
||||
if curl -s http://localhost:9999 > /dev/null 2>&1; then
|
||||
echo " 后端已就绪 (http://localhost:9999)"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 120 ]; then
|
||||
echo " 后端启动超时,请查看日志: $LOG_DIR/backend.log"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# 等待前端 (最多 30 秒)
|
||||
for i in $(seq 1 30); do
|
||||
if curl -s http://localhost:3000 > /dev/null 2>&1; then
|
||||
echo " 前端已就绪 (http://localhost:3000)"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 30 ]; then
|
||||
echo " 前端启动超时,请查看日志: $LOG_DIR/frontend.log"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo "==> 重启完成"
|
||||
echo " 后端日志: tail -f $LOG_DIR/backend.log"
|
||||
echo " 前端日志: tail -f $LOG_DIR/frontend.log"
|
||||
Loading…
Reference in New Issue
Block a user