#!/usr/bin/env bash # ============================================================================= # 04-build.sh — 编译所有后端 Go 服务 # # 编译产物输出至 .local-dev/bin/ # 支持只编译单个服务:./04-build.sh [service-name] # # 可用服务名: openim-server, chat-rpc, admin-rpc, chat-api, admin-api, # meetingmsg, livecloud, livestream # # 后续步骤:05-start.sh(启动后端服务) # ============================================================================= set -euo pipefail source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" init_dirs init_script_log # ← 脚本执行日志 require_tools go header "步骤 4 / 5 — 编译后端 Go 服务" # 编译单个服务的函数 # 用法: _build _build() { local name="$1" dir="$ROOT_DIR/$2" pkg="$3" local out="$BUILD_DIR/$name" info "编译 ${BOLD}$name${NC} ..." local start_ts=$SECONDS if (cd "$dir" && go build -o "$out" "$pkg"); then local elapsed=$(( SECONDS - start_ts )) success " ✓ $name → $out (${elapsed}s)" else error " ✗ $name 编译失败" return 1 fi } # 服务列表:名称 | 源码目录(相对 ROOT) | 包路径 declare -A SVC_DIR=( [openim-server]="open-im-server" [chat-rpc]="chat" [admin-rpc]="chat" [chat-api]="chat" [admin-api]="chat" [meetingmsg]="meetingmsg" [livecloud]="livecloud" [livestream]="livestream" [build-server]="build-server" ) declare -A SVC_PKG=( [openim-server]="./cmd/main.go" [chat-rpc]="./cmd/rpc/chat-rpc/" [admin-rpc]="./cmd/rpc/admin-rpc/" [chat-api]="./cmd/api/chat-api/" [admin-api]="./cmd/api/admin-api/" [meetingmsg]="." [livecloud]="." [livestream]="." [build-server]="." ) # ── 判断是编译单个还是全部 ──────────────────────────────────────────────────── TARGET="${1:-all}" if [[ "$TARGET" == "all" ]]; then step "编译全部服务(共 ${#SVC_DIR[@]} 个)" FAILED=() for svc in openim-server chat-rpc admin-rpc chat-api admin-api meetingmsg livecloud livestream build-server; do _build "$svc" "${SVC_DIR[$svc]}" "${SVC_PKG[$svc]}" || FAILED+=("$svc") done echo "" if [[ ${#FAILED[@]} -eq 0 ]]; then success "所有服务编译完成!" ls -lh "$BUILD_DIR/" | awk 'NR>1 {printf " %-20s %s\n", $NF, $5}' else error "以下服务编译失败: ${FAILED[*]}" echo "" echo "排查建议:" echo " 1. cd $ROOT_DIR/ && go mod tidy" echo " 2. 检查 Go 版本: go version(推荐 1.21+)" echo " 3. 检查模块依赖: go mod download" exit 1 fi else # 编译单个服务 if [[ -z "${SVC_DIR[$TARGET]:-}" ]]; then error "未知服务: $TARGET" echo "可用: ${!SVC_DIR[*]}" exit 1 fi step "编译单个服务: $TARGET" _build "$TARGET" "${SVC_DIR[$TARGET]}" "${SVC_PKG[$TARGET]}" success "$TARGET 编译完成" fi echo "" echo -e "${BOLD}下一步:${NC}" echo -e " 启动所有后端服务:" echo -e " ${CYAN}./deploy-test/05-start.sh${NC}" echo -e " 或只启动单个服务:" echo -e " ${CYAN}./deploy-test/05-start.sh openim-server${NC}"