| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- #!/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 <<EOF
- 用法: $0 [选项]
- 选项:
- -c <Debug|Release> 编译配置 (默认: Release)
- -t <server|report|all> 打包目标 (默认: 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
|