build.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #!/bin/bash
  2. set -euo pipefail
  3. # ─── 颜色 ───────────────────────────────────────────────────────────────────
  4. GREEN='\033[0;32m'
  5. RED='\033[0;31m'
  6. YELLOW='\033[1;33m'
  7. CYAN='\033[0;36m'
  8. NC='\033[0m'
  9. log_info() { echo -e "${CYAN}[INFO] $*${NC}"; }
  10. log_ok() { echo -e "${GREEN}[OK] $*${NC}"; }
  11. log_warn() { echo -e "${YELLOW}[WARN] $*${NC}"; }
  12. log_error() { echo -e "${RED}[ERROR] $*${NC}"; }
  13. # ─── 默认参数 ────────────────────────────────────────────────────────────────
  14. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
  15. # Windows-only 项目 (net5.0-windows) 无法在 macOS/Linux 编译,非 Windows 用 server filter
  16. if [[ "$(uname -s)" == "MINGW"* ]] || [[ "$(uname -s)" == "CYGWIN"* ]]; then
  17. SOLUTION="$SCRIPT_DIR/Workspace.sln"
  18. else
  19. SOLUTION="$SCRIPT_DIR/Workspace.server.slnf"
  20. fi
  21. OUTPUT_SERVER="$SCRIPT_DIR/src/_output.server"
  22. OUTPUT_REPORT="$SCRIPT_DIR/output.report"
  23. PACKAGE_DIR="$SCRIPT_DIR/dist"
  24. CONFIG="Release"
  25. PACK=false
  26. TARGET="server" # server | report | all
  27. # ─── 用法 ────────────────────────────────────────────────────────────────────
  28. usage() {
  29. cat <<EOF
  30. 用法: $0 [选项]
  31. 选项:
  32. -c <Debug|Release> 编译配置 (默认: Release)
  33. -t <server|report|all> 打包目标 (默认: server)
  34. -p 编译后打包成 tar.gz
  35. -h 显示帮助
  36. 示例:
  37. $0 # Release 编译
  38. $0 -c Debug # Debug 编译
  39. $0 -c Release -p # Release 编译并打包服务端
  40. $0 -c Release -t all -p # Release 编译并打包所有目标
  41. EOF
  42. exit 0
  43. }
  44. # ─── 解析参数 ────────────────────────────────────────────────────────────────
  45. while getopts "c:t:ph" opt; do
  46. case $opt in
  47. c) CONFIG="$OPTARG" ;;
  48. t) TARGET="$OPTARG" ;;
  49. p) PACK=true ;;
  50. h) usage ;;
  51. *) usage ;;
  52. esac
  53. done
  54. if [[ "$CONFIG" != "Debug" && "$CONFIG" != "Release" ]]; then
  55. log_error "无效的编译配置: $CONFIG(只支持 Debug 或 Release)"
  56. exit 1
  57. fi
  58. if [[ "$TARGET" != "server" && "$TARGET" != "report" && "$TARGET" != "all" ]]; then
  59. log_error "无效的打包目标: $TARGET(只支持 server / report / all)"
  60. exit 1
  61. fi
  62. # ─── 环境检查 ────────────────────────────────────────────────────────────────
  63. check_env() {
  64. if ! command -v dotnet &>/dev/null; then
  65. log_error "未找到 dotnet,请先安装 .NET SDK"
  66. exit 1
  67. fi
  68. local dotnet_ver
  69. dotnet_ver=$(dotnet --version)
  70. log_info "dotnet 版本: $dotnet_ver"
  71. if [ ! -f "$SOLUTION" ]; then
  72. log_error "找不到 solution 文件: $SOLUTION"
  73. exit 1
  74. fi
  75. }
  76. # ─── 编译 ────────────────────────────────────────────────────────────────────
  77. do_build() {
  78. log_info "开始编译 [配置: $CONFIG]"
  79. log_info "Solution: $SOLUTION"
  80. echo ""
  81. if dotnet build "$SOLUTION" \
  82. --configuration "$CONFIG" \
  83. --no-incremental \
  84. -v minimal; then
  85. echo ""
  86. log_ok "编译成功"
  87. else
  88. echo ""
  89. log_error "编译失败,请检查上方错误信息"
  90. exit 1
  91. fi
  92. }
  93. # ─── 打包 ────────────────────────────────────────────────────────────────────
  94. do_pack() {
  95. local timestamp
  96. timestamp=$(date '+%Y%m%d_%H%M%S')
  97. mkdir -p "$PACKAGE_DIR"
  98. pack_target() {
  99. local name="$1"
  100. local src_dir="$2"
  101. if [ ! -d "$src_dir" ]; then
  102. log_warn "输出目录不存在,跳过打包: $src_dir"
  103. return
  104. fi
  105. local archive="$PACKAGE_DIR/${name}_${CONFIG}_${timestamp}.tar.gz"
  106. log_info "打包 $name -> $(basename "$archive")"
  107. tar -czf "$archive" -C "$(dirname "$src_dir")" "$(basename "$src_dir")"
  108. local size
  109. size=$(du -sh "$archive" | cut -f1)
  110. log_ok "打包完成: $archive [$size]"
  111. }
  112. case "$TARGET" in
  113. server) pack_target "server" "$OUTPUT_SERVER" ;;
  114. report) pack_target "report" "$OUTPUT_REPORT" ;;
  115. all)
  116. pack_target "server" "$OUTPUT_SERVER"
  117. pack_target "report" "$OUTPUT_REPORT"
  118. ;;
  119. esac
  120. }
  121. # ─── 主流程 ──────────────────────────────────────────────────────────────────
  122. main() {
  123. echo ""
  124. echo -e "${CYAN}========================================${NC}"
  125. echo -e "${CYAN} OpenCards Server 构建脚本${NC}"
  126. echo -e "${CYAN}========================================${NC}"
  127. echo ""
  128. check_env
  129. do_build
  130. if $PACK; then
  131. echo ""
  132. do_pack
  133. fi
  134. echo ""
  135. echo -e "${GREEN}========================================${NC}"
  136. echo -e "${GREEN} 全部完成${NC}"
  137. echo -e "${GREEN}========================================${NC}"
  138. echo ""
  139. }
  140. main