From 2c8dd5040f9e507491fbcb23f65c4d35b62343c4 Mon Sep 17 00:00:00 2001 From: Stev_Wang <304865932@qq.com> Date: Tue, 3 Nov 2026 09:45:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(dev):=20=E4=BF=AE=E5=A4=8D=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E4=BC=9A=E8=AF=9D=E5=AF=BC=E8=87=B4=E7=9A=84=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=9B=9E=E8=B7=B3=E5=B9=B6=E9=BB=98=E8=AE=A4=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E8=BF=90=E8=A1=8C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: - dev.sh 会把仓库根 .env 的变量全部导出给子进程,其中 VITE_PUBLIC_DEMO_SESSION=true 被 Vite 读取后启用演示会话:登录写入 假 token,进入 /users 后真实接口 401、刷新失败即清会话回登录页; - 后台启动后终端看不到运行日志,不利于排查。 改动: - dev.sh 不再向子进程导出 VITE_*,前端环境仍由 Vite 自己管理; - .env.example 的 VITE_PUBLIC_DEMO_SESSION 默认改为 false(本地 .env / .env.local 同步); - ./dev.sh 默认启动后前台跟随日志(Ctrl+C 停止全部),新增 -d/--detach 后台模式;非交互环境仍默认后台; - README 同步脚本用法。 影响面: - 仅开发脚本与示例环境;生产与 CI 不涉及;演示会话仍可通过显式 VITE_PUBLIC_DEMO_SESSION=true 开启。 回滚方式: - 回滚本提交即恢复后台启动与 VITE_* 透传行为。 验证证据: - 浏览器登录会真实请求 POST /api/v1/auth/login,错误账号返回 「账号或密码不正确」; - 真实账号登录后停留在 /users 并加载 9 条成员,不再回跳登录页; - ./dev.sh -f 持续输出 api/web/worker 日志,SIGTERM 后服务与端口 全部释放; - bash -n dev.sh 与 pnpm format:check 通过。 --- .env.example | 2 +- README.md | 5 +++-- dev.sh | 22 +++++++++++++++++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index 3b8c533..de6d2af 100644 --- a/.env.example +++ b/.env.example @@ -45,7 +45,7 @@ WORKER_CONCURRENCY=2 # ---------- 前端(只能暴露 VITE_PUBLIC_* 前缀,ENV-07) ---------- VITE_PUBLIC_API_BASE_URL=http://127.0.0.1:3000/api/v1 # A0 登录壳没有接后端鉴权,置 true 时登录页写入本地演示会话以便查看布局;A1 接入真实登录后删除。 -VITE_PUBLIC_DEMO_SESSION=true +VITE_PUBLIC_DEMO_SESSION=false # ---------- 可观测 ---------- OTEL_EXPORTER_OTLP_ENDPOINT= diff --git a/README.md b/README.md index 57ad5aa..0a82310 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,11 @@ pnpm db:seed # 幂等写入 system_configs 基线 pnpm dev # 并行启动 api(3000) / web(5173) / worker ``` -也可以使用一键脚本(后台启动、自动检测并释放端口、带健康检查): +也可以使用一键脚本(自动检测并释放端口、带健康检查,启动后默认跟随日志): ```bash -./dev.sh # 启动 api + web + worker +./dev.sh # 启动 api + web + worker,并前台跟随日志(Ctrl+C 停止全部) +./dev.sh start -d # 后台启动 ./dev.sh status # 端口 / PID / 健康状态 ./dev.sh logs [api|web|worker] # 跟踪日志(默认全部) ./dev.sh stop # 停止并释放 3000 / 5173 diff --git a/dev.sh b/dev.sh index 823e3c0..04596e0 100755 --- a/dev.sh +++ b/dev.sh @@ -49,7 +49,8 @@ WORKER_FILTER="@lingxi/worker" # shellcheck disable=SC2034 COMMAND="start" SERVICES=("api" "web" "worker") -FOLLOW=0 +# auto:终端下启动后直接跟随日志;非交互(脚本/CI)默认后台 +FOLLOW="auto" AUTO_KILL=1 # ---------- 输出 ---------- @@ -71,8 +72,9 @@ usage() { 灵犀 · 开发机服务启动脚本(不启动 DB / Redis 容器) 用法: - ./dev.sh 启动(默认 api + web + worker) + ./dev.sh 启动服务并前台跟随运行日志(Ctrl+C 停止全部) ./dev.sh start 同上 + ./dev.sh start -d 后台启动,立即返回 ./dev.sh stop 停止全部服务并释放端口 ./dev.sh restart 重启 ./dev.sh status 查看端口、PID 与健康状态 @@ -83,7 +85,8 @@ usage() { --api-only 只启动 api --web-only 只启动 web --no-worker 不启动 worker - --follow, -f 启动后前台跟踪日志,Ctrl+C 停止全部 + -d, --detach 后台启动,不跟随日志 + -f, --follow 强制前台跟随日志(默认在终端下开启) --no-kill 端口占用时不自动结束,直接报错退出 -h, --help 显示帮助 @@ -130,6 +133,8 @@ parse_args() { ;; --follow|-f) FOLLOW=1; shift ;; + -d|--detach) + FOLLOW=0; shift ;; --no-kill) AUTO_KILL=0; shift ;; -h|--help) @@ -301,6 +306,8 @@ load_env_files() { value="${value%\"}" value="${value#\'}" value="${value%\'}" + # VITE_* 交给前端自己的 envDir 处理,避免覆盖 Vite 的构建/运行配置 + case "$key" in VITE_*) continue ;; esac # shell 里已有的变量优先,不覆盖 if [[ -z "${!key:-}" ]]; then export "$key=$value" @@ -490,12 +497,18 @@ start_services() { local files=() for service in "${SERVICES[@]}"; do files+=("$(svc_log "$service")"); done sleep 0.3 + printf '\n' + dim "以下为运行日志,按 Ctrl+C 停止全部服务" + printf '\n' # 后台 tail + wait:前台 tail 会阻塞信号 trap,导致 Ctrl+C 不生效 tail -n 20 -F "${files[@]}" & TAIL_PID=$! trap cleanup_follow INT TERM wait "$TAIL_PID" || true stop_services + else + printf '\n' + dim "后台运行中:./dev.sh logs 查看日志,./dev.sh stop 停止服务" fi } @@ -568,6 +581,9 @@ clean_state() { # ---------- 主流程 ---------- parse_args "$@" +if [[ "$FOLLOW" == "auto" ]]; then + if [[ -t 1 ]]; then FOLLOW=1; else FOLLOW=0; fi +fi load_env_files resolve_ports