#!/bin/bash # Tetris Game 自动化构建脚本 # 支持 Windows、macOS 和 Linux 平台 set -e # 遇到错误立即退出 # 颜色定义 BLUE='\033[34m' GREEN='\033[32m' YELLOW='\033[33m' RED='\033[31m' RESET='\033[0m' # 配置 VERSION="1.0" BUILD_TIME=$(date '+%Y-%m-%d %H:%M:%S') GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") # 函数:打印带颜色的消息 print_info() { echo -e "${BLUE}ℹ️ $1${RESET}" } print_success() { echo -e "${GREEN}✅ $1${RESET}" } print_warning() { echo -e "${YELLOW}⚠️ $1${RESET}" } print_error() { echo -e "${RED}❌ $1${RESET}" } # 函数:显示帮助信息 show_help() { echo -e "${BLUE}🎮 Tetris Game 自动化构建脚本${RESET}" echo "" echo "用法: $0 [选项] [平台]" echo "" echo "平台:" echo " windows 构建 Windows 版本" echo " macos 构建 macOS 版本" echo " linux 构建 Linux 版本" echo " all 构建所有平台 (默认)" echo "" echo "选项:" echo " -h, --help 显示帮助信息" echo " -c, --clean 构建前清理" echo " -v, --verify 构建后验证" echo " -i, --info 显示构建信息" echo " --no-color 禁用颜色输出" echo "" echo "示例:" echo " $0 # 构建所有平台" echo " $0 windows # 仅构建 Windows" echo " $0 -c all # 清理后构建所有平台" echo " $0 -cv macos # 清理、构建 macOS 并验证" } # 函数:显示构建信息 show_info() { print_info "构建信息" echo " 版本: v${VERSION}" echo " 构建时间: ${BUILD_TIME}" echo " Git 提交: ${GIT_COMMIT}" echo " Go 版本: $(go version 2>/dev/null || echo '未安装')" echo " 当前平台: $(go env GOOS 2>/dev/null || echo 'unknown')/$(go env GOARCH 2>/dev/null || echo 'unknown')" echo " 工作目录: $(pwd)" } # 函数:检查环境 check_environment() { print_info "检查构建环境..." # 检查 Go if ! command -v go &> /dev/null; then print_error "Go 未安装或不在 PATH 中" exit 1 fi print_success "Go 环境正常" # 检查必要文件 if [ ! -f "main.go" ]; then print_error "main.go 文件不存在" exit 1 fi if [ ! -d "assets" ]; then print_error "assets 目录不存在" exit 1 fi print_success "源代码文件检查通过" } # 函数:清理构建文件 clean_build() { print_info "清理构建文件..." make clean print_success "清理完成" } # 函数:构建指定平台 build_platform() { local platform=$1 print_info "构建 ${platform} 版本..." case $platform in windows) make windows ;; macos) make macos ;; linux) make linux ;; all) make all ;; *) print_error "不支持的平台: $platform" exit 1 ;; esac print_success "${platform} 构建完成" } # 函数:验证构建结果 verify_build() { print_info "验证构建结果..." make verify print_success "验证完成" } # 函数:显示构建结果摘要 show_summary() { echo "" print_success "🎉 构建完成!" echo "" print_info "构建结果摘要:" if [ -d "dist" ]; then echo " 分发目录: dist/" # 显示文件大小 if [ -f "dist/TetrisGame-Windows-v1.0.zip" ]; then local size=$(ls -lh dist/TetrisGame-Windows-v1.0.zip | awk '{print $5}') echo " Windows 版本: TetrisGame-Windows-v1.0.zip (${size})" fi if [ -f "dist/TetrisGame-macOS-v1.0.dmg" ]; then local size=$(ls -lh dist/TetrisGame-macOS-v1.0.dmg | awk '{print $5}') echo " macOS 版本: TetrisGame-macOS-v1.0.dmg (${size})" fi if [ -f "dist/TetrisGame-Linux-v1.0.tar.gz" ]; then local size=$(ls -lh dist/TetrisGame-Linux-v1.0.tar.gz | awk '{print $5}') echo " Linux 版本: TetrisGame-Linux-v1.0.tar.gz (${size})" fi echo "" print_info "总计文件数: $(find dist/ -type f -name '*.zip' -o -name '*.dmg' -o -name '*.tar.gz' | wc -l | tr -d ' ')" # 计算总大小 local total_size=$(find dist/ -type f -name '*.zip' -o -name '*.dmg' -o -name '*.tar.gz' -exec ls -l {} \; | awk '{sum += $5} END {print sum}') if [ -n "$total_size" ] && [ "$total_size" -gt 0 ]; then local total_mb=$((total_size / 1024 / 1024)) echo " 总大小: ${total_mb}MB" fi else print_warning "dist 目录不存在" fi echo "" print_info "使用说明:" echo " - 查看详细文档: cat BUILD.md" echo " - 验证构建: make verify" echo " - 运行游戏: make run" } # 主函数 main() { local platform="all" local clean_first=false local verify_after=false local show_info_only=false # 解析命令行参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -c|--clean) clean_first=true shift ;; -v|--verify) verify_after=true shift ;; -i|--info) show_info_only=true shift ;; --no-color) # 禁用颜色 BLUE='' GREEN='' YELLOW='' RED='' RESET='' shift ;; windows|macos|linux|all) platform=$1 shift ;; *) print_error "未知参数: $1" echo "使用 $0 --help 查看帮助" exit 1 ;; esac done # 显示标题 echo -e "${BLUE}🎮 Tetris Game 自动化构建脚本 v${VERSION}${RESET}" echo "" # 如果只是显示信息 if [ "$show_info_only" = true ]; then show_info exit 0 fi # 检查环境 check_environment # 清理(如果需要) if [ "$clean_first" = true ]; then clean_build fi # 构建 build_platform "$platform" # 验证(如果需要) if [ "$verify_after" = true ]; then verify_build fi # 显示摘要 show_summary } # 错误处理 trap 'print_error "构建过程中发生错误,退出码: $?"' ERR # 运行主函数 main "$@"