-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdev.sh
More file actions
executable file
·88 lines (74 loc) · 3.45 KB
/
dev.sh
File metadata and controls
executable file
·88 lines (74 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env bash
# =============================================================================
# Copilot Hub — 开发环境启动脚本
#
# 用法:
# bash dev.sh # 同时启动后端 (8000) + 前端 dev server (8002)
# bash dev.sh --backend-only # 仅启动后端
# bash dev.sh --frontend-only # 仅启动前端
#
# 依赖:uv(Python 环境)、node/npm(前端)
# =============================================================================
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")"
BACKEND_PORT=8000
FRONTEND_PORT=8002
MODE="all"
for arg in "$@"; do
[[ "$arg" == "--backend-only" ]] && MODE="backend"
[[ "$arg" == "--frontend-only" ]] && MODE="frontend"
done
# ── 颜色 ──────────────────────────────────────────────────────────────────────
GRN='\033[0;32m'; BLU='\033[0;34m'; YLW='\033[1;33m'; RST='\033[0m'
echo -e "${GRN}==> Copilot Hub 开发环境${RST}"
# ── 1. Python 环境(uv)──────────────────────────────────────────────────────
if [[ "$MODE" != "frontend" ]]; then
echo -e "${BLU}--> 初始化 Python 环境 (uv)...${RST}"
if ! command -v uv &>/dev/null; then
echo "未找到 uv,请先安装: curl -LsSf https://astral.sh/uv/install.sh | sh"
exit 1
fi
# 同步 requirements.txt 与 pyproject.toml(保持开发/生产一致)
uv export --no-dev --no-hashes -o requirements.txt --quiet
uv sync --quiet
echo -e " 虚拟环境: .venv"
fi
# ── 2. 前端依赖 ───────────────────────────────────────────────────────────────
if [[ "$MODE" != "backend" ]]; then
echo -e "${BLU}--> 安装前端依赖...${RST}"
cd frontend
if command -v pnpm &>/dev/null; then
pnpm install --silent
else
npm install --silent
fi
cd ..
fi
# ── 3. 确保 .vite_proxy 存在(让后端知道去代理前端 dev server)─────────────────
if [[ "$MODE" != "backend" ]]; then
echo "proxy to vite dev server at http://localhost:${FRONTEND_PORT}" > .vite_proxy
fi
echo ""
echo -e "${YLW}启动服务:${RST}"
[[ "$MODE" != "frontend" ]] && echo -e " 后端 → ${GRN}http://localhost:${BACKEND_PORT}${RST} (uvicorn --reload)"
[[ "$MODE" != "backend" ]] && echo -e " 前端 → ${GRN}http://localhost:${FRONTEND_PORT}${RST} (vite dev)"
echo ""
# ── 4. 并发启动 ───────────────────────────────────────────────────────────────
trap 'echo -e "\n${YLW}正在停止...${RST}"; kill 0' INT TERM
if [[ "$MODE" == "all" ]]; then
# 后端(reload 模式)
uv run uvicorn main:app \
--host 0.0.0.0 --port "$BACKEND_PORT" \
--reload --log-level info &
BACKEND_PID=$!
# 前端 dev server
(cd frontend && npx vite --host 0.0.0.0 --port "$FRONTEND_PORT") &
FRONTEND_PID=$!
wait "$BACKEND_PID" "$FRONTEND_PID"
elif [[ "$MODE" == "backend" ]]; then
uv run uvicorn main:app \
--host 0.0.0.0 --port "$BACKEND_PORT" \
--reload --log-level info
elif [[ "$MODE" == "frontend" ]]; then
cd frontend && npx vite --host 0.0.0.0 --port "$FRONTEND_PORT"
fi