Files
cocos/tools/package-for-project.sh
2026-06-18 14:07:38 +08:00

113 lines
4.3 KiB
Bash
Executable File
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.
#!/usr/bin/env bash
# 步骤 1打包 — 单一运行时包,本地与 CDN 完全一致
#
# bash tools/package-for-project.sh
#
# 产物:
# build/mstest5/ 运行时包(← 本地 import + OSS 上传,内容相同)
# build/deploy/ 上传清单(不进 OSS / static
# build/standalone-player/ 独立调试页(可选,不进 OSS / static
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_DIR="$PROJECT_DIR/build/web-desktop"
MODE="cdn"
OUT_DIR="$PROJECT_DIR/build/mstest5"
DEPLOY_DIR="$PROJECT_DIR/build/deploy"
CDN_BASE=""
PKG_EXTRA=()
CDN_REF="${COCOS_CDN_UNITY_REF:-$HOME/tfrh/竞赛/mstest5}"
SKIP_MANIFEST=0
MAKE_ZIP=0
usage() {
echo "步骤 1 - 打包(单一运行时包)" >&2
echo "" >&2
echo "用法: $0 [options]" >&2
echo " --build DIR Cocos 构建目录(默认 build/web-desktop" >&2
echo " --out DIR 运行时包目录(默认 build/mstest5" >&2
echo " --mode cdn|flat cdn=默认; flat=旧扁平包(不推荐)" >&2
echo " --cdn-base URL 写入 deploy/UPLOAD-MANIFEST.txt" >&2
echo " --skip-manifest 不生成 deploy/ 清单" >&2
echo " --zip 额外生成 build/mstest5-runtime.zip" >&2
echo "" >&2
echo "默认分包: scenes 首屏assets_all / 关卡库分片 / 每关 bundle 进关按需" >&2
echo " MERGE_LEVELS=1 合并 level-prefabs 进 assets_all不推荐" >&2
echo "运行时包结构(本地 static/unity = OSS unitycdndir:" >&2
echo " Build/ StreamingAssets/ levels-db-index.json(.br) levels-database.json(.br)" >&2
echo " 首屏: scenes_all + assets_all进关: 关卡库分片 + 关卡 bundle" >&2
echo "" >&2
echo "步骤 2: scratch-gui/static/unity/import-to-unity.sh" >&2
}
while [[ $# -gt 0 ]]; do
case "$1" in
--build) BUILD_DIR="$2"; shift 2 ;;
--out) OUT_DIR="$2"; shift 2 ;;
--mode) MODE="$2"; shift 2 ;;
--cdn-base) CDN_BASE="$2"; shift 2 ;;
--skip-manifest) SKIP_MANIFEST=1; shift ;;
--zip) MAKE_ZIP=1; shift ;;
--brotli-db) PKG_EXTRA+=(--brotli-db); shift ;;
--preload-resources) PKG_EXTRA+=(--preload-resources); shift ;;
--no-minify-db) PKG_EXTRA+=(--no-minify-db); shift ;;
-h|--help) usage; exit 0 ;;
*) echo "未知参数: $1" >&2; usage; exit 1 ;;
esac
done
[[ -f "$BUILD_DIR/index.js" || -f "$BUILD_DIR/index.html" ]] || {
echo "错误: 请先 Cocos 构建 Web Desktop: $BUILD_DIR" >&2
exit 1
}
DB="$PROJECT_DIR/assets/level-data/levels-database.json"
if [[ ! -f "$DB" ]] || [[ "$(python3 -c "import json; d=json.load(open('$DB')); print(len(d.get('levels',{})))" 2>/dev/null || echo 0)" -lt 100 ]]; then
echo "==> 从 Cocos 导出关卡库"
bash "$SCRIPT_DIR/sync-level-db.sh"
fi
case "$MODE" in
cdn)
CDN_REF="$(cd "$CDN_REF" 2>/dev/null && pwd || true)"
if [[ -z "$CDN_REF" || ! -f "$CDN_REF/StreamingAssets/aa/catalog.json" ]]; then
echo "错误: 缺少 Unity 参考包: $CDN_REF" >&2
exit 1
fi
# 移除旧的双份产物
rm -rf "$PROJECT_DIR/build/cdn-upload" "$PROJECT_DIR/build/cdn-upload.zip" 2>/dev/null || true
echo "==> [1/2] 打运行时包"
bash "$SCRIPT_DIR/verify-split-build.sh" "$BUILD_DIR"
node "$SCRIPT_DIR/package-for-cdn.js" "$BUILD_DIR" "$OUT_DIR" "$CDN_REF"
if [[ "$SKIP_MANIFEST" -eq 0 ]]; then
echo "==> [2/2] 生成 OSS 上传清单build/deploy/,不复制包)"
MANIFEST_ARGS=("$OUT_DIR" --manifest-dir "$DEPLOY_DIR")
[[ -n "$CDN_BASE" ]] && MANIFEST_ARGS+=(--cdn-base "$CDN_BASE")
[[ "$MAKE_ZIP" -eq 1 ]] && MANIFEST_ARGS+=(--zip)
node "$SCRIPT_DIR/write-deploy-manifest.js" "${MANIFEST_ARGS[@]}"
fi
;;
flat)
OUT_DIR="${OUT_DIR:-$PROJECT_DIR/build/unity-runtime}"
echo "==> [警告] flat 模式与 CDN 不一致" >&2
if ((${#PKG_EXTRA[@]} > 0)); then
node "$SCRIPT_DIR/package-for-project.js" "$BUILD_DIR" "$OUT_DIR" "${PKG_EXTRA[@]}"
else
node "$SCRIPT_DIR/package-for-project.js" "$BUILD_DIR" "$OUT_DIR"
fi
;;
*)
echo "错误: --mode 须为 cdn 或 flat" >&2
exit 1
;;
esac
echo ""
echo "==> 运行时包: $OUT_DIR"
echo " 本地: import-to-unity.sh"
echo " CDN: 上传 $OUT_DIR/ 全部 → unitycdndir"
[[ "$SKIP_MANIFEST" -eq 0 && "$MODE" == "cdn" ]] && echo " 清单: $DEPLOY_DIR/UPLOAD-MANIFEST.txt"