#!/bin/bash # 鲸鱼镇 Web版本导出工具 (Linux/macOS) # 版本: 1.0.0 # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置变量 - 请根据实际情况修改 PROJECT_NAME="whaleTown" BUILD_DIR="build/web" GODOT_PATH="/usr/local/bin/godot" # macOS Homebrew默认路径 # GODOT_PATH="/usr/bin/godot" # Linux包管理器默认路径 # GODOT_PATH="$HOME/Applications/Godot.app/Contents/MacOS/Godot" # macOS应用程序路径 EXPORT_PRESET="Web" VERSION="1.0.0" echo "========================================" echo " 鲸鱼镇 Web版本导出工具 v1.0" echo "========================================" echo # 检查Godot是否存在 echo -e "${BLUE}[检查]${NC} 验证Godot安装..." if [ ! -f "$GODOT_PATH" ]; then echo -e "${RED}[错误]${NC} 未找到Godot: $GODOT_PATH" echo echo "请修改脚本中的GODOT_PATH变量或安装Godot 4.5+" echo "安装方法:" echo " macOS: brew install godot" echo " Ubuntu: sudo apt install godot3" echo " 或从官网下载: https://godotengine.org/download" echo exit 1 fi # 检查项目文件 echo -e "${BLUE}[检查]${NC} 验证项目文件..." if [ ! -f "project.godot" ]; then echo -e "${RED}[错误]${NC} 未找到project.godot文件!" echo "请在项目根目录运行此脚本" echo exit 1 fi # 显示项目信息 echo -e "${GREEN}[信息]${NC} 项目信息:" echo " 项目名称: $PROJECT_NAME" echo " 版本号: $VERSION" echo " Godot路径: $GODOT_PATH" echo " 导出预设: $EXPORT_PRESET" echo " 输出目录: $BUILD_DIR" echo # 创建构建目录结构 echo -e "${BLUE}[构建]${NC} 准备构建环境..." mkdir -p "$BUILD_DIR" mkdir -p "scripts" # 备份旧版本(如果存在) if [ -f "$BUILD_DIR/index.html" ]; then echo -e "${YELLOW}[备份]${NC} 备份旧版本..." BACKUP_DIR="build/backup/$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" cp -r "$BUILD_DIR"/* "$BACKUP_DIR/" 2>/dev/null echo " 备份位置: $BACKUP_DIR/" fi # 清理旧文件 echo -e "${BLUE}[清理]${NC} 清理旧的导出文件..." rm -f "$BUILD_DIR"/* # 检查导出预设 echo -e "${BLUE}[验证]${NC} 检查导出预设..." "$GODOT_PATH" --headless --export-debug "$EXPORT_PRESET" --check-only >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "${RED}[错误]${NC} 导出预设 \"$EXPORT_PRESET\" 不存在或配置错误!" echo "请在Godot编辑器中创建Web导出预设" echo exit 1 fi # 导出项目 echo -e "${GREEN}[导出]${NC} 开始导出Web版本..." echo " 目标文件: $BUILD_DIR/index.html" echo " 请稍候..." echo "$GODOT_PATH" --headless --export-release "$EXPORT_PRESET" "$BUILD_DIR/index.html" if [ $? -ne 0 ]; then echo -e "${RED}[失败]${NC} 导出失败!" echo echo "可能的原因:" echo "1. 导出模板未安装" echo "2. 项目配置错误" echo "3. 资源文件损坏" echo exit 1 fi # 验证导出文件 echo -e "${BLUE}[验证]${NC} 验证导出文件..." REQUIRED_FILES="index.html index.js index.wasm index.pck" MISSING_FILES="" for file in $REQUIRED_FILES; do if [ ! -f "$BUILD_DIR/$file" ]; then MISSING_FILES="$MISSING_FILES $file" fi done if [ -n "$MISSING_FILES" ]; then echo -e "${RED}[错误]${NC} 缺少必要文件:$MISSING_FILES" echo "导出可能不完整,请检查Godot配置" echo exit 1 fi # 复制额外资源 echo -e "${BLUE}[复制]${NC} 复制额外资源..." [ -f "assets/web/favicon.ico" ] && cp "assets/web/favicon.ico" "$BUILD_DIR/" [ -f "assets/web/manifest.json" ] && cp "assets/web/manifest.json" "$BUILD_DIR/" [ -f "assets/web/service-worker.js" ] && cp "assets/web/service-worker.js" "$BUILD_DIR/" [ -f "assets/web/custom_shell.html" ] && cp "assets/web/custom_shell.html" "$BUILD_DIR/" # 生成部署信息 echo -e "${BLUE}[生成]${NC} 生成部署信息..." cat > "$BUILD_DIR/deploy_info.json" << EOF { "project": "$PROJECT_NAME", "version": "$VERSION", "build_time": "$(date)", "platform": "web", "godot_version": "4.5", "export_preset": "$EXPORT_PRESET", "build_machine": "$(hostname)", "build_user": "$(whoami)", "build_os": "$(uname -s)" } EOF # 生成.htaccess文件 echo -e "${BLUE}[配置]${NC} 生成Apache配置文件..." cat > "$BUILD_DIR/.htaccess" << 'EOF' # 鲸鱼镇 Web版本 Apache配置 # 自动生成 # MIME类型配置 AddType application/wasm .wasm AddType application/octet-stream .pck AddType application/javascript .js # 启用压缩 AddOutputFilterByType DEFLATE text/html text/css application/javascript application/wasm AddOutputFilterByType DEFLATE application/json application/xml # 缓存控制 ExpiresActive On ExpiresByType application/wasm "access plus 1 month" ExpiresByType application/octet-stream "access plus 1 month" ExpiresByType application/javascript "access plus 1 week" ExpiresByType text/html "access plus 1 hour" # CORS配置 Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization" Header set Cross-Origin-Embedder-Policy "require-corp" Header set Cross-Origin-Opener-Policy "same-origin" EOF # 计算文件大小 echo -e "${BLUE}[统计]${NC} 计算文件大小..." TOTAL_SIZE=$(du -sb "$BUILD_DIR" | cut -f1) TOTAL_MB=$((TOTAL_SIZE / 1024 / 1024)) # 显示构建结果 echo echo "========================================" echo -e "${GREEN} 导出成功!${NC}" echo "========================================" echo echo -e "${GREEN}[完成]${NC} 构建统计:" echo " 导出位置: $BUILD_DIR/" echo " 总文件大小: ${TOTAL_MB} MB" echo " 构建时间: $(date)" echo echo -e "${BLUE}[文件]${NC} 导出文件列表:" for file in "$BUILD_DIR"/*; do if [ -f "$file" ]; then filename=$(basename "$file") size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null) size_mb=$((size / 1024 / 1024)) if [ $size_mb -gt 0 ]; then echo " $filename: ${size_mb} MB" else size_kb=$((size / 1024)) echo " $filename: ${size_kb} KB" fi fi done echo echo -e "${YELLOW}[下一步]${NC} 部署选项:" echo " 1. 本地测试: ./scripts/serve_web.sh" echo " 2. 上传到服务器: 将 $BUILD_DIR/ 目录上传" echo " 3. 查看文档: docs/web_deployment_guide.md" echo echo -e "${GREEN}[提示]${NC} 部署前请确保:" echo " - 服务器支持WASM MIME类型" echo " - 配置了正确的CORS头" echo " - 启用了文件压缩" echo # 询问是否启动本地服务器 echo -n "是否启动本地测试服务器?(y/N): " read -r START_SERVER if [[ $START_SERVER =~ ^[Yy]$ ]]; then echo echo -e "${GREEN}[启动]${NC} 启动本地服务器..." ./scripts/serve_web.sh else echo echo "构建完成!可以手动运行 ./scripts/serve_web.sh 进行测试" fi