#!/bin/zsh set -u PROJECT_DIR="${0:A:h}" RUN_DIR="$PROJECT_DIR/.run" PID_FILE="$RUN_DIR/spine-particle.pid" LOG_FILE="$RUN_DIR/spine-particle.log" URL="http://127.0.0.1:5173/" open_project_url() { if [[ "${SPINE_PARTICLE_NO_OPEN:-0}" != "1" ]]; then open "$URL"; fi } mkdir -p "$RUN_DIR" cd "$PROJECT_DIR" || exit 1 if [[ -f "$PID_FILE" ]]; then RUNNING_PID="$(tr -dc '0-9' < "$PID_FILE")" if [[ -n "$RUNNING_PID" ]] && kill -0 "$RUNNING_PID" 2>/dev/null; then echo "Spine粒子编辑器已经在运行,正在打开页面:" echo "$URL" open_project_url exit 0 fi rm -f "$PID_FILE" fi # 兼容此前手动启动、尚未生成 PID 文件的本项目服务。 PORT_PID="$(lsof -tiTCP:5173 -sTCP:LISTEN 2>/dev/null | head -n 1)" if [[ -n "$PORT_PID" ]]; then PROCESS_CWD="$(lsof -a -p "$PORT_PID" -d cwd -Fn 2>/dev/null | sed -n 's/^n//p' | head -n 1)" if [[ "$PROCESS_CWD" == "$PROJECT_DIR" ]]; then echo "$PORT_PID" > "$PID_FILE" echo "Spine粒子编辑器已经在运行,正在打开页面:" echo "$URL" open_project_url exit 0 fi echo "5173 端口正被其他程序占用:$PROCESS_CWD" read "?按回车键关闭窗口..." exit 1 fi if ! command -v npm >/dev/null 2>&1; then echo "未找到 npm,请先安装 Node.js。" echo "https://nodejs.org/" read "?按回车键关闭窗口..." exit 1 fi if [[ ! -x "$PROJECT_DIR/node_modules/.bin/vite" ]]; then echo "首次运行,正在安装项目依赖..." npm install || { echo "依赖安装失败,请检查网络或 npm 配置。" read "?按回车键关闭窗口..." exit 1 } fi echo "正在启动 Spine粒子编辑器..." nohup "$PROJECT_DIR/node_modules/.bin/vite" --host 127.0.0.1 --port 5173 --strictPort > "$LOG_FILE" 2>&1 & SERVER_PID=$! echo "$SERVER_PID" > "$PID_FILE" for _ in {1..60}; do if ! kill -0 "$SERVER_PID" 2>/dev/null; then echo "项目启动失败,日志如下:" tail -n 30 "$LOG_FILE" rm -f "$PID_FILE" read "?按回车键关闭窗口..." exit 1 fi if curl -fsS "$URL" >/dev/null 2>&1; then echo "启动成功:$URL" open_project_url exit 0 fi sleep 0.25 done echo "项目启动超时,请查看日志:$LOG_FILE" read "?按回车键关闭窗口..." exit 1