#!/bin/bash # ============================================================ # OpenDance Studio —— Windows 客户端发布打包 # # 产物(文档 §5.3): # opendance-windows-v0.1.0.zip # ├── OpenDance.exe # ├── OpenDance.pck # ├── THIRD_PARTY.md # ├── README.txt # └── contracts/ 契约快照 # # 用法:bash build/package-release.sh [版本号] # ============================================================ set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$PROJECT_DIR" VERSION="${1:-0.1.0}" NAME="opendance-windows-v${VERSION}" OUT_DIR="$PROJECT_DIR/dist-release" STAGE="$OUT_DIR/$NAME" log() { printf '\033[1;34m[package]\033[0m %s\n' "$*"; } die() { printf '\033[1;31m[error]\033[0m %s\n' "$*" >&2; exit 1; } EXE="$PROJECT_DIR/build/windows/OpenDance.exe" PCK="$PROJECT_DIR/build/windows/OpenDance.pck" [ -f "$EXE" ] || die "未找到 $EXE,请先执行 bash build/export-windows.sh release" [ -f "$PCK" ] || die "未找到 $PCK,请先执行 bash build/export-windows.sh release" # 校验 PE 头 MAGIC=$(head -c 2 "$EXE" | od -An -tx1 | tr -d ' \n') [ "$MAGIC" = "4d5a" ] || die "$EXE 不是合法的 Windows PE 文件(头 $MAGIC)" log "整理产物到 $STAGE …" rm -rf "$STAGE" mkdir -p "$STAGE" cp "$EXE" "$STAGE/OpenDance.exe" cp "$PCK" "$STAGE/OpenDance.pck" cp THIRD_PARTY.md README.txt "$STAGE/" cp -r contracts "$STAGE/contracts" log "生成压缩包…" ( cd "$OUT_DIR" && zip -qr "$NAME.zip" "$NAME" ) log "完成:$OUT_DIR/$NAME.zip($(du -h "$OUT_DIR/$NAME.zip" | cut -f1))" echo "" echo "产物内容:" unzip -l "$OUT_DIR/$NAME.zip" | sed -n '4,20p' echo "" echo "分发:把 zip 交给 Windows 用户,解压后运行 OpenDance.exe(.pck 必须同目录)。"