#!/usr/bin/env bash # ============================================================================= # 08-build-static-frontend.sh — 构建静态前端产物(dist) # # 用法: # ./08-build-static-frontend.sh # 构建全部静态前端 # ./08-build-static-frontend.sh # 构建指定项目 # # 可用项目: pc, cms, build-cms, build-down # ============================================================================= set -euo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" init_dirs load_env init_script_log header "构建静态前端" STATIC_FRONTENDS=(pc cms build-cms build-down) declare -A FE_PM=( [pc]="yarn" [cms]="pnpm" [build-cms]="pnpm" [build-down]="npm" ) declare -A FE_BUILD_CMD=( [pc]="yarn build" [cms]="pnpm run build" [build-cms]="pnpm run build" [build-down]="npm run build" ) declare -A FE_DIST_FILE=( [pc]="$ROOT_DIR/pc/dist/index.html" [cms]="$ROOT_DIR/cms/dist/index.html" [build-cms]="$ROOT_DIR/build-cms/dist/index.html" [build-down]="$ROOT_DIR/build-down/dist/index.html" ) declare -A FE_URL=( [pc]="https://${PC_PROXY_DOMAIN:-pc-jack.imharry.work}/" [cms]="http://cms-jack.imharry.work/" [build-cms]="http://build-jack.imharry.work/" [build-down]="http://down-jack.imharry.work/" ) _build_one() { local name="$1" local dir="$ROOT_DIR/$name" local pm="${FE_PM[$name]}" local cmd="${FE_BUILD_CMD[$name]}" local dist_file="${FE_DIST_FILE[$name]}" local logfile="$LOG_DIR/build-${name}.log" if [[ ! -d "$dir" ]]; then error "$name 目录不存在: $dir" return 1 fi if [[ ! -d "$dir/node_modules" ]]; then error "$name node_modules 不存在,请先执行: ./deploy-test/06-install-frontend.sh $name" return 1 fi if ! command -v "$pm" >/dev/null 2>&1; then error "$name 需要 $pm,但当前未安装" return 1 fi info "构建 ${BOLD}$name${NC} ..." : > "$logfile" if [[ "$name" == "pc" ]]; then pc_ensure_wasm_assets pc_export_vite_backend_env pc_print_vite_backend_env fi ( cd "$dir" # shellcheck disable=SC2086 $cmd 2>&1 ) | tee "$logfile" if [[ ! -f "$dist_file" ]]; then error "$name 构建完成,但未找到产物: $dist_file" return 1 fi success "$name 构建完成: $dist_file" info "访问地址: ${FE_URL[$name]}" } TARGET="${1:-all}" if [[ "$TARGET" == "all" ]]; then FAILED=() for project in "${STATIC_FRONTENDS[@]}"; do if ! _build_one "$project"; then FAILED+=("$project") fi echo "" done if [[ ${#FAILED[@]} -gt 0 ]]; then error "以下项目构建失败: ${FAILED[*]}" exit 1 fi else valid=false for project in "${STATIC_FRONTENDS[@]}"; do if [[ "$TARGET" == "$project" ]]; then valid=true break fi done if ! $valid; then error "未知项目: $TARGET" echo "可用: ${STATIC_FRONTENDS[*]}" exit 1 fi _build_one "$TARGET" fi echo "" success "静态前端构建完成" echo "下一步:" echo " sudo ./deploy-test/00-init-tools.sh nginx" echo " ./deploy-test/09-verify-static-frontends.sh"