Files
whale-town-front/tools/build_web.sh
王浩 0b533189ec refactor:重构项目架构为分层结构
## 🏗️ 主要变更

### 目录结构重构
- 将 core/ 迁移到 _Core/(框架层)
- 将 scenes/ 重构为 Scenes/(玩法层)和 UI/(界面层)
- 将 data/ 迁移到 Config/(配置层)
- 添加 Assets/ 资源层和 Utils/ 工具层
- 将 scripts/ 迁移到 tools/(开发工具)

### 架构分层
- **_Core/**: 框架层 - 全局单例和管理器
- **Scenes/**: 玩法层 - 游戏场景和实体
- **UI/**: 界面层 - HUD、窗口、对话系统
- **Assets/**: 资源层 - 精灵图、音频、字体
- **Config/**: 配置层 - 游戏配置和本地化
- **Utils/**: 工具层 - 通用辅助脚本

### 文件更新
- 更新 project.godot 中的所有路径引用
- 更新自动加载脚本路径
- 更新测试文件的引用路径
- 添加 REFACTORING.md 详细说明
- 添加 MIGRATION_COMPLETE.md 迁移完成标记
- 更新 README.md 反映新架构

### 设计原则
-  清晰的分层(框架/玩法/界面)
-  场景内聚(脚本紧邻场景文件)
-  组件化设计(可复用组件)
-  职责单一(每个目录职责明确)

## 📋 详细信息
查看 REFACTORING.md 了解完整的重构说明和迁移映射表

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-31 11:36:01 +08:00

238 lines
7.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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
# 启用压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/wasm
AddOutputFilterByType DEFLATE application/json application/xml
</IfModule>
# 缓存控制
<IfModule mod_expires.c>
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"
</IfModule>
# CORS配置
<IfModule mod_headers.c>
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"
</IfModule>
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