Files
whale-town-front/scripts/build_web.sh
moyin 0935c5fd76 feat:添加Web版本自动化部署系统
- 实现跨平台Web导出脚本(Windows/Linux/macOS)
- 添加本地测试服务器启动脚本
- 配置Godot Web导出预设
- 创建Web资源目录结构
- 支持一键导出和本地测试
2025-12-25 23:06:29 +08:00

238 lines
7.0 KiB
Bash
Raw 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