-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdev-kit.sh
More file actions
executable file
·132 lines (113 loc) · 3.98 KB
/
dev-kit.sh
File metadata and controls
executable file
·132 lines (113 loc) · 3.98 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"
open_url() {
local url="$1"
if command -v open >/dev/null 2>&1; then
open "$url" >/dev/null 2>&1 || true
elif command -v xdg-open >/dev/null 2>&1; then
xdg-open "$url" >/dev/null 2>&1 || true
elif command -v cmd.exe >/dev/null 2>&1; then
cmd.exe /c start "$url" >/dev/null 2>&1 || true
else
echo -e "${YELLOW}请手动打开: ${url}${NC}"
fi
}
cleanup() {
echo -e "\n${YELLOW}🛑 正在停止 dev 服务...${NC}"
if [ -n "${BACKEND_PID:-}" ]; then kill "$BACKEND_PID" 2>/dev/null || true; fi
if [ -n "${KIT_PID:-}" ]; then kill "$KIT_PID" 2>/dev/null || true; fi
pkill -f "go run .*sqlite_fts5" 2>/dev/null || true
pkill -f "vite dev" 2>/dev/null || true
echo -e "${GREEN}✅ 已停止${NC}"
}
trap cleanup INT TERM
echo -e "${BLUE}🚀 Dev 启动(Go + SvelteKit)...${NC}"
command -v go >/dev/null 2>&1 || { echo -e "${RED}❌ 需要安装 Go${NC}"; exit 1; }
command -v node >/dev/null 2>&1 || { echo -e "${RED}❌ 需要安装 Node.js${NC}"; exit 1; }
command -v npm >/dev/null 2>&1 || { echo -e "${RED}❌ 需要安装 npm${NC}"; exit 1; }
check_port() {
local port=$1
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1 ; then
echo -e "${YELLOW}⚠️ 端口 $port 已被占用,尝试停止占用进程...${NC}"
lsof -ti:$port | xargs kill -9 2>/dev/null || true
sleep 1
fi
}
echo -e "${BLUE}🔍 检查端口占用...${NC}"
check_port 9000
check_port 9001
echo -e "${BLUE}📦 启动后端(:9000,FTS5)...${NC}"
# 首次启动:依赖下载/编译可能较慢,尽量使用国内 GOPROXY
if [ -z "${GOPROXY:-}" ]; then
export GOPROXY=https://goproxy.cn,direct
echo -e "${YELLOW}📡 已设置 GOPROXY=${GOPROXY}${NC}"
fi
echo -e "${YELLOW}📥 预拉取 Go 依赖...${NC}"
(cd backend && go mod download) || {
echo -e "${YELLOW}⚠️ 预拉取失败,尝试备用代理...${NC}"
export GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
(cd backend && go mod download) || true
}
(cd backend && go run -tags sqlite_fts5 . > ../backend.log 2>&1) &
BACKEND_PID=$!
# 等待后端健康检查
BACKEND_READY=false
for i in {1..90}; do
if curl -s -f http://localhost:9000/health > /dev/null 2>&1; then
BACKEND_READY=true
break
fi
# 如果进程已退出,直接输出日志并失败
if ! kill -0 "$BACKEND_PID" 2>/dev/null; then
echo -e "${RED}❌ 后端进程已退出${NC}"
break
fi
if [ $((i % 10)) -eq 0 ]; then
echo -e "${YELLOW} 已等待后端启动 ${i}s...(首次下载/编译可能较慢)${NC}"
fi
sleep 1
done
if [ "$BACKEND_READY" = false ]; then
echo -e "${RED}❌ 后端未成功启动(/health 不可达)${NC}"
echo -e "${YELLOW}📋 backend.log(最后120行):${NC}"
tail -120 backend.log 2>/dev/null || true
exit 1
fi
echo -e "${BLUE}🎨 启动前端(SvelteKit dev :9001)...${NC}"
if [ ! -d "kit/node_modules" ]; then
echo -e "${YELLOW}📥 安装 kit 依赖(首次较慢)...${NC}"
(cd kit && npm install)
fi
(cd kit && npm run dev > ../kit.log 2>&1) &
KIT_PID=$!
# 等待前端首页可达
KIT_READY=false
for i in {1..20}; do
if curl -s http://localhost:9001/ > /dev/null 2>&1; then
KIT_READY=true
break
fi
sleep 1
done
if [ "$KIT_READY" = false ]; then
echo -e "${RED}❌ 前端未成功启动(9001 不可达)${NC}"
echo -e "${YELLOW}📋 kit.log(最后80行):${NC}"
tail -80 kit.log 2>/dev/null || true
exit 1
fi
echo -e "${GREEN}✅ Dev 已启动${NC}"
echo -e "${BLUE}📝 API: ${GREEN}http://localhost:9000/api${NC}"
echo -e "${BLUE}🌐 Web: ${GREEN}http://localhost:9001${NC}"
echo -e "${BLUE}🔐 登录页: ${GREEN}http://localhost:9001/login${NC}"
echo -e "${YELLOW}查看日志: tail -f backend.log 或 tail -f kit.log${NC}"
echo -e "${YELLOW}按 Ctrl+C 停止${NC}"
# 自动打开浏览器(优先打开登录页)
open_url "http://localhost:9001/login"
wait