forked from moyin/whale-town-front
- 实现跨平台Web导出脚本(Windows/Linux/macOS) - 添加本地测试服务器启动脚本 - 配置Godot Web导出预设 - 创建Web资源目录结构 - 支持一键导出和本地测试
238 lines
7.0 KiB
Bash
238 lines
7.0 KiB
Bash
#!/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 |