|
|
#!/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 "$@" |