#!/bin/bash set -euo pipefail # ─── 颜色 ─────────────────────────────────────────────────────────────────── GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' CYAN='\033[0;36m' NC='\033[0m' log_info() { echo -e "${CYAN}[INFO] $*${NC}"; } log_ok() { echo -e "${GREEN}[OK] $*${NC}"; } log_warn() { echo -e "${YELLOW}[WARN] $*${NC}"; } log_error() { echo -e "${RED}[ERROR] $*${NC}"; } # ─── 默认参数 ──────────────────────────────────────────────────────────────── SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # Windows-only 项目 (net5.0-windows) 无法在 macOS/Linux 编译,非 Windows 用 server filter if [[ "$(uname -s)" == "MINGW"* ]] || [[ "$(uname -s)" == "CYGWIN"* ]]; then SOLUTION="$SCRIPT_DIR/Workspace.sln" else SOLUTION="$SCRIPT_DIR/Workspace.server.slnf" fi OUTPUT_SERVER="$SCRIPT_DIR/src/_output.server" OUTPUT_REPORT="$SCRIPT_DIR/output.report" PACKAGE_DIR="$SCRIPT_DIR/dist" CONFIG="Release" PACK=false TARGET="server" # server | report | all # ─── 用法 ──────────────────────────────────────────────────────────────────── usage() { cat < 编译配置 (默认: Release) -t 打包目标 (默认: server) -p 编译后打包成 tar.gz -h 显示帮助 示例: $0 # Release 编译 $0 -c Debug # Debug 编译 $0 -c Release -p # Release 编译并打包服务端 $0 -c Release -t all -p # Release 编译并打包所有目标 EOF exit 0 } # ─── 解析参数 ──────────────────────────────────────────────────────────────── while getopts "c:t:ph" opt; do case $opt in c) CONFIG="$OPTARG" ;; t) TARGET="$OPTARG" ;; p) PACK=true ;; h) usage ;; *) usage ;; esac done if [[ "$CONFIG" != "Debug" && "$CONFIG" != "Release" ]]; then log_error "无效的编译配置: $CONFIG(只支持 Debug 或 Release)" exit 1 fi if [[ "$TARGET" != "server" && "$TARGET" != "report" && "$TARGET" != "all" ]]; then log_error "无效的打包目标: $TARGET(只支持 server / report / all)" exit 1 fi # ─── 环境检查 ──────────────────────────────────────────────────────────────── check_env() { if ! command -v dotnet &>/dev/null; then log_error "未找到 dotnet,请先安装 .NET SDK" exit 1 fi local dotnet_ver dotnet_ver=$(dotnet --version) log_info "dotnet 版本: $dotnet_ver" if [ ! -f "$SOLUTION" ]; then log_error "找不到 solution 文件: $SOLUTION" exit 1 fi } # ─── 编译 ──────────────────────────────────────────────────────────────────── do_build() { log_info "开始编译 [配置: $CONFIG]" log_info "Solution: $SOLUTION" echo "" if dotnet build "$SOLUTION" \ --configuration "$CONFIG" \ --no-incremental \ -v minimal; then echo "" log_ok "编译成功" else echo "" log_error "编译失败,请检查上方错误信息" exit 1 fi } # ─── 打包 ──────────────────────────────────────────────────────────────────── do_pack() { local timestamp timestamp=$(date '+%Y%m%d_%H%M%S') mkdir -p "$PACKAGE_DIR" pack_target() { local name="$1" local src_dir="$2" if [ ! -d "$src_dir" ]; then log_warn "输出目录不存在,跳过打包: $src_dir" return fi local archive="$PACKAGE_DIR/${name}_${CONFIG}_${timestamp}.tar.gz" log_info "打包 $name -> $(basename "$archive")" tar -czf "$archive" -C "$(dirname "$src_dir")" "$(basename "$src_dir")" local size size=$(du -sh "$archive" | cut -f1) log_ok "打包完成: $archive [$size]" } case "$TARGET" in server) pack_target "server" "$OUTPUT_SERVER" ;; report) pack_target "report" "$OUTPUT_REPORT" ;; all) pack_target "server" "$OUTPUT_SERVER" pack_target "report" "$OUTPUT_REPORT" ;; esac } # ─── 主流程 ────────────────────────────────────────────────────────────────── main() { echo "" echo -e "${CYAN}========================================${NC}" echo -e "${CYAN} OpenCards Server 构建脚本${NC}" echo -e "${CYAN}========================================${NC}" echo "" check_env do_build if $PACK; then echo "" do_pack fi echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN} 全部完成${NC}" echo -e "${GREEN}========================================${NC}" echo "" } main