#!/usr/bin/env bash set -euo pipefail usage() { cat <<'EOF' 用法: ./scripts/update.sh 说明: 1. 对当前仓库执行 git pull 2. 只构建前端 3. 固定同步前端 dist 到 /work/dist 4. 固定同步 server-node 到 /work/server-node 注意: - server-node 同步时会排除 dist 和 node_modules - 不会构建后端 - 不会执行 npm ci - 不会重启 PM2 EOF } require_command() { local command_name="$1" if ! command -v "$command_name" >/dev/null 2>&1; then echo "[update] 缺少命令: $command_name" >&2 exit 1 fi } if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then usage exit 0 fi require_command git require_command npm require_command rsync SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" CLIENT_TARGET_DIR="/work/dist" SERVER_TARGET_DIR="/work/server-node" echo "[update] 仓库目录: ${REPO_ROOT}" echo "[update] 前端目标目录: ${CLIENT_TARGET_DIR}" echo "[update] 后端目标目录: ${SERVER_TARGET_DIR}" cd "${REPO_ROOT}" # 先拉取当前分支的最新代码。 echo "[update] 拉取当前分支最新代码" git pull # 只构建前端,不处理后端构建。 echo "[update] 构建前端" npm run build # 固定创建 /work 下的目标目录。 echo "[update] 创建目标目录" mkdir -p "${CLIENT_TARGET_DIR}" "${SERVER_TARGET_DIR}" # 同步前端构建产物。 echo "[update] 同步前端 dist -> ${CLIENT_TARGET_DIR}" rsync -a --delete "${REPO_ROOT}/dist/" "${CLIENT_TARGET_DIR}/" # 同步 server-node 源码和配置,但保留目标目录自己的 dist 和 node_modules。 echo "[update] 同步 server-node -> ${SERVER_TARGET_DIR}" rsync -a --delete \ --exclude 'dist/' \ --exclude 'node_modules/' \ "${REPO_ROOT}/server-node/" "${SERVER_TARGET_DIR}/" echo "[update] 完成"