fix(packaging): 发布包 exe 的 PE 版本资源必须等于发布版本(v0.2.2)
缺陷(v0.2.1 实测):把 opendance-windows-v0.2.1.zip 解开、在 Windows 上
「右键 → 属性 → 详细信息」,显示的是
文件版本 0.1.0
产品版本 0.1.0
而产物名、Git tag、README 全是 v0.2.1 —— 正是文档 §11.2 要禁止的
「不可核对的发布」。
根因:export_presets.cfg 的 application/file_version /
application/product_version 被硬编码在 0.1.0,而它们**不会**跟随
project.godot 的 application/config/version 自动更新;check-version.sh 当时
只比 project.godot ↔ project.yaml(两处一致),所以静态校验全绿、产物却是错的。
漂移发生在没人看的第三个位置 —— 校验位置少一个,等于没校验。
证据:
strings -a -el OpenDance.exe -> FileVersion 0.1.0 / ProductVersion 0.1.0
VS_FIXEDFILEINFO @0x67b976c -> FileVersion 0.1.0.0 / ProductVersion 0.0.0.0
对照组:官方模板 windows_release_x86_64.exe 的 FileVersion = 4.7.2,
说明本机 rcedit 改写是生效的,问题纯粹在预设的值本身。
修复:
* build/sync-export-version.sh(新增):导出前把版本号写进导出预设,
幂等、拒绝非 X.Y.Z;
* build/check-pe-version.sh(新增):直接读 exe 的 PE 版本资源 ——
VS_FIXEDFILEINFO(签名 0xFEEF04BD 后 16 字节,grep -abo 取偏移约 40 ms)
与 StringFileInfo(strings -el,资源管理器属性页显示的就是它)。
两处都查:实测固定信息里的 ProductVersion 恒为 0.0.0.0;
* build/check-version.sh:新增导出预设两个键的校验;
* build/export-windows.sh:导出前同步、导出后直接复核产物;
* build/package-release.sh:打包前校验源 exe、解包后再校验包内 exe;
* build/verify.sh:新增步骤 1/5「产物 PE 版本资源」(未导出则跳过);
* tests/test_about.gd:新增 test_export_preset_version_matches_project_version。
反向验证:把预设 file_version 改回 0.1.0 →
check-version.sh 退出码 1(报出两处不一致);
无头测试 753 通过 / 1 失败,失败项正是
「导出预设的 file_version 与版本号唯一来源一致」。
实测 v0.2.2 产物:PE FileVersion 0.2.2.0 / StringFileInfo 0.2.2,
版本号在 project.godot / project.yaml / export_presets.cfg / exe 元数据 /
产物名 / tag 六处一致。verify.sh 全绿(754 通过 / 0 失败 / 5 跳过)。
同时把 LZMA 压缩的取舍写清楚:deflate 包 38,248,818 B 仍超 IIS
30,000,000 B 上限,故 Release 资产仍是 LZMA 整包(26,628,529 B,不拆分卷);
若上限放开或改由 Web /static 分发,用 ZIP_METHOD=deflate 重打包即可得到
资源管理器可直接双击解压的包。
This commit is contained in:
Executable
+116
@@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# OpenDance Studio —— Windows 可执行文件的 PE 版本资源校验
|
||||
#
|
||||
# 背景(真实缺陷):发布包里的 `OpenDance.exe` 是 Godot 用
|
||||
# `export_presets.cfg` 的 `application/file_version` / `application/product_version`
|
||||
# 通过 rcedit 写进 PE `VERSIONINFO` 资源的。这两个键**当初被硬编码成 0.1.0 后再没人更新**,
|
||||
# 于是 v0.2.1 的发布包在 Windows 上「右键 → 属性 → 详细信息」显示的是
|
||||
# 文件版本 0.1.0 / 产品版本 0.1.0
|
||||
# —— 产物名与 Gitea tag 是 v0.2.1,二进制元数据却是 0.1.0,正是文档 §11.2
|
||||
# 要禁止的那种「不可核对的发布」。光校验 project.godot / project.yaml 抓不到它:
|
||||
# 那两处当时是一致的,漂移发生在**导出预设**里。
|
||||
#
|
||||
# 因此本脚本直接读产物本身的两种版本元数据:
|
||||
# 1. VS_FIXEDFILEINFO(二进制,权威、机器可读)
|
||||
# FileVersionMS/LS、ProductVersionMS/LS —— 位于签名 0xFEEF04BD 之后 16 字节;
|
||||
# 2. StringFileInfo(UTF-16LE 文本,资源管理器「详细信息」里显示的就是它)
|
||||
# FileVersion / ProductVersion 键值对。
|
||||
#
|
||||
# 用法:
|
||||
# bash build/check-pe-version.sh <exe> [期望版本 X.Y.Z]
|
||||
# 不带期望版本时只打印实际值(排障用),退出码 0;
|
||||
# 带期望版本时任一不一致即退出码 1。
|
||||
# ============================================================
|
||||
set -uo pipefail
|
||||
|
||||
EXE="${1:-}"
|
||||
EXPECTED="${2:-}"
|
||||
|
||||
if [ -z "$EXE" ]; then
|
||||
echo "用法:bash build/check-pe-version.sh <exe> [期望版本 X.Y.Z]" >&2
|
||||
exit 2
|
||||
fi
|
||||
if [ ! -f "$EXE" ]; then
|
||||
echo "✗ 找不到文件:$EXE" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# ---- 1. VS_FIXEDFILEINFO ----
|
||||
# 签名 0xFEEF04BD(LE 字节序 bd 04 ef fe)在整个文件的 `VERSIONINFO` 资源里唯一。
|
||||
# 用 grep -abo 直接拿字节偏移(109 MB 文件约 40 ms),再 od 读 4 个 DWORD。
|
||||
SIG_OFFSETS=$(LC_ALL=C grep -abo "$(printf '\xbd\x04\xef\xfe')" "$EXE" 2>/dev/null | cut -d: -f1)
|
||||
SIG_COUNT=$(printf '%s\n' "$SIG_OFFSETS" | grep -c . || true)
|
||||
|
||||
if [ "$SIG_COUNT" -eq 0 ]; then
|
||||
echo "✗ $EXE 里没有 VS_FIXEDFILEINFO 签名(0xFEEF04BD),PE 版本资源缺失" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ "$SIG_COUNT" -gt 1 ]; then
|
||||
echo "⚠ $EXE 里出现 $SIG_COUNT 处签名,取第一处($SIG_COUNT > 1 时结果可能不准)" >&2
|
||||
fi
|
||||
SIG_OFFSET=$(printf '%s\n' "$SIG_OFFSETS" | head -1)
|
||||
|
||||
read -r FV_MS FV_LS PV_MS PV_LS <<<"$(od -An -tu4 -j $((SIG_OFFSET + 16)) -N 16 "$EXE" | tr -s ' ')"
|
||||
fmt_version() { printf '%s.%s.%s.%s' "$(( $1 >> 16 ))" "$(( $1 & 0xFFFF ))" "$(( $2 >> 16 ))" "$(( $2 & 0xFFFF ))"; }
|
||||
FIXED_FILE_VERSION="$(fmt_version "$FV_MS" "$FV_LS")"
|
||||
FIXED_PRODUCT_VERSION="$(fmt_version "$PV_MS" "$PV_LS")"
|
||||
|
||||
# ---- 2. StringFileInfo(UTF-16LE 文本)----
|
||||
# `strings -el` 会把 UTF-16LE 字符串按出现顺序逐行列出,键与值相邻:
|
||||
# FileVersion
|
||||
# 0.1.0
|
||||
# 取键所在行的下一行即为值。缺 strings(binutils) 时降级为只查固定信息。
|
||||
string_value_of() {
|
||||
local key="$1" text="$2"
|
||||
printf '%s\n' "$text" | awk -v k="$key" '$0 == k { getline; print; exit }'
|
||||
}
|
||||
STRING_DUMP=""
|
||||
if command -v strings >/dev/null 2>&1; then
|
||||
STRING_DUMP="$(strings -a -el "$EXE" 2>/dev/null || true)"
|
||||
fi
|
||||
STR_FILE_VERSION="$(string_value_of FileVersion "$STRING_DUMP")"
|
||||
STR_PRODUCT_VERSION="$(string_value_of ProductVersion "$STRING_DUMP")"
|
||||
STR_PRODUCT_NAME="$(string_value_of ProductName "$STRING_DUMP")"
|
||||
STR_COMPANY="$(string_value_of CompanyName "$STRING_DUMP")"
|
||||
|
||||
echo " PE 版本资源($EXE):"
|
||||
echo " VS_FIXEDFILEINFO FileVersion = ${FIXED_FILE_VERSION:-(未读到)}"
|
||||
echo " VS_FIXEDFILEINFO ProductVersion = ${FIXED_PRODUCT_VERSION:-(未读到)}"
|
||||
if [ -n "$STRING_DUMP" ]; then
|
||||
echo " StringFileInfo FileVersion = ${STR_FILE_VERSION:-(未找到)}"
|
||||
echo " StringFileInfo ProductVersion = ${STR_PRODUCT_VERSION:-(未找到)}"
|
||||
echo " StringFileInfo ProductName = ${STR_PRODUCT_NAME:-(未找到)}"
|
||||
echo " StringFileInfo CompanyName = ${STR_COMPANY:-(未找到)}"
|
||||
else
|
||||
echo " StringFileInfo (本机没有 strings/binutils,跳过文本项)"
|
||||
fi
|
||||
|
||||
if [ -z "$EXPECTED" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# ---- 3. 与期望版本比对 ----
|
||||
FAILED=0
|
||||
# 固定信息的第 4 段是 revision,rcedit 一律写 0,因此只比前三段
|
||||
fixed_prefix="${FIXED_FILE_VERSION%.*}"
|
||||
if [ "$fixed_prefix" != "$EXPECTED" ]; then
|
||||
echo " ✗ PE FileVersion 为 ${FIXED_FILE_VERSION:-(空)},期望 ${EXPECTED}.x(Windows 属性页会显示错版本)" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
if [ -n "$STRING_DUMP" ]; then
|
||||
if [ "$STR_FILE_VERSION" != "$EXPECTED" ]; then
|
||||
echo " ✗ 资源字符串 FileVersion 为 '${STR_FILE_VERSION:-(空)}',期望 '${EXPECTED}'" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
if [ "$STR_PRODUCT_VERSION" != "$EXPECTED" ]; then
|
||||
echo " ✗ 资源字符串 ProductVersion 为 '${STR_PRODUCT_VERSION:-(空)}',期望 '${EXPECTED}'" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
fi
|
||||
if [ "$FAILED" -ne 0 ]; then
|
||||
echo " ✗ PE 版本资源与期望版本不一致 —— 请先跑 bash build/sync-export-version.sh 并重新导出" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " ✓ PE 版本资源一致:FileVersion ${FIXED_FILE_VERSION} / 资源字符串 ${EXPECTED}"
|
||||
+29
-4
@@ -20,15 +20,40 @@ cd "$PROJECT_DIR"
|
||||
|
||||
GODOT_VERSION="$(sed -n 's/^config\/version="\(.*\)"$/\1/p' project.godot | head -1)"
|
||||
YAML_VERSION="$(sed -n 's/^version:[[:space:]]*//p' project.yaml | head -1)"
|
||||
PRESET="$PROJECT_DIR/export_presets.cfg"
|
||||
PRESET_FILE_VERSION="$(sed -n 's/^application\/file_version="\(.*\)"$/\1/p' "$PRESET" 2>/dev/null | head -1)"
|
||||
PRESET_PRODUCT_VERSION="$(sed -n 's/^application\/product_version="\(.*\)"$/\1/p' "$PRESET" 2>/dev/null | head -1)"
|
||||
EXPECTED="${1:-$YAML_VERSION}"
|
||||
|
||||
printf ' project.godot application/config/version = %s\n' "${GODOT_VERSION:-(未找到)}"
|
||||
printf ' project.yaml version = %s\n' "${YAML_VERSION:-(未找到)}"
|
||||
printf ' 期望版本 = %s\n' "${EXPECTED:-(未指定)}"
|
||||
printf ' project.godot application/config/version = %s\n' "${GODOT_VERSION:-(未找到)}"
|
||||
printf ' project.yaml version = %s\n' "${YAML_VERSION:-(未找到)}"
|
||||
printf ' export_presets application/file_version = %s\n' "${PRESET_FILE_VERSION:-(未找到)}"
|
||||
printf ' export_presets application/product_version= %s\n' "${PRESET_PRODUCT_VERSION:-(未找到)}"
|
||||
printf ' 期望版本 = %s\n' "${EXPECTED:-(未指定)}"
|
||||
|
||||
FAILED=0
|
||||
[ -n "$GODOT_VERSION" ] || { echo " ✗ 无法从 project.godot 解析 config/version" >&2; FAILED=1; }
|
||||
[ -n "$YAML_VERSION" ] || { echo " ✗ 无法从 project.yaml 解析 version" >&2; FAILED=1; }
|
||||
# 导出预设的 file_version / product_version 决定 OpenDance.exe 的 PE 版本资源,
|
||||
# 即 Windows「右键 → 属性 → 详细信息」里显示的版本。它们**不会**随 project.godot
|
||||
# 自动更新,曾经因此让 v0.2.1 的发布包显示 0.1.0。这里静态拦住;
|
||||
# 产物那一侧再由 build/check-pe-version.sh 直接读 exe 复核。
|
||||
if [ ! -f "$PRESET" ]; then
|
||||
echo " ✗ 找不到 export_presets.cfg(无法校验 PE 版本资源的来源)" >&2
|
||||
FAILED=1
|
||||
else
|
||||
for PAIR in "file_version:$PRESET_FILE_VERSION" "product_version:$PRESET_PRODUCT_VERSION"; do
|
||||
KEY="${PAIR%%:*}"; VALUE="${PAIR#*:}"
|
||||
if [ -z "$VALUE" ]; then
|
||||
echo " ✗ export_presets.cfg 缺少 application/${KEY}(导出后 PE 版本资源会沿用旧值)" >&2
|
||||
FAILED=1
|
||||
elif [ -n "$GODOT_VERSION" ] && [ "$VALUE" != "$GODOT_VERSION" ]; then
|
||||
echo " ✗ 导出预设 application/${KEY}=${VALUE} 与 project.godot 的 ${GODOT_VERSION} 不一致" >&2
|
||||
echo " (Windows 属性页会显示 ${VALUE};跑 bash build/sync-export-version.sh 后重新导出)" >&2
|
||||
FAILED=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if [ -n "$EXPECTED" ] && [ "$GODOT_VERSION" != "$EXPECTED" ]; then
|
||||
echo " ✗ project.godot 的版本与期望不一致(界面/About 会显示错版本)" >&2
|
||||
FAILED=1
|
||||
@@ -48,4 +73,4 @@ if [ "$FAILED" -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo " ✓ 版本一致:v$GODOT_VERSION(project.godot = project.yaml${EXPECTED:+ = 期望值})"
|
||||
echo " ✓ 版本一致:v$GODOT_VERSION(project.godot = project.yaml = export_presets.cfg${EXPECTED:+ = 期望值})"
|
||||
|
||||
+20
-1
@@ -67,6 +67,17 @@ if [ ! -d "$TEMPLATE_DIR" ] || [ -z "$(ls -A "$TEMPLATE_DIR" 2>/dev/null)" ]; th
|
||||
fi
|
||||
echo "[export] 导出模板:$(ls "$TEMPLATE_DIR" | tr '\n' ' ')"
|
||||
|
||||
# ---- 导出前:把版本号同步进导出预设 ----
|
||||
# export_presets.cfg 的 application/file_version / product_version 决定产物 exe 的
|
||||
# PE 版本资源(Windows「右键 → 属性 → 详细信息」里显示的版本),它们**不会**
|
||||
# 跟随 project.godot 的 application/config/version 自动更新。不在这里同步,
|
||||
# 导出的包就会带着旧版本号 —— v0.2.1 正是因此显示了 0.1.0。
|
||||
echo "[export] 同步版本号到导出预设…"
|
||||
bash "$PROJECT_DIR/build/sync-export-version.sh" || {
|
||||
echo "错误:导出预设版本同步失败。" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ---- 确保资源已导入(缺失会让导出静默产出不完整的包)----
|
||||
echo "[export] 导入资源…"
|
||||
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --import >/dev/null 2>&1 || true
|
||||
@@ -105,11 +116,19 @@ if [ "$MAGIC" != "4d5a" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 校验 PE 版本资源 = 当前项目版本(文档 §11.2:产物元数据也必须可核对)
|
||||
PROJECT_VERSION="$(sed -n 's/^config\/version="\(.*\)"$/\1/p' "$PROJECT_DIR/project.godot" | head -1)"
|
||||
echo "[export] 校验产物 PE 版本资源(期望 $PROJECT_VERSION)…"
|
||||
if ! bash "$PROJECT_DIR/build/check-pe-version.sh" "$EXE" "$PROJECT_VERSION"; then
|
||||
echo "错误:$EXE 的 PE 版本资源与项目版本不一致。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SIZE_EXE=$(stat -c%s "$EXE")
|
||||
SIZE_PCK=$(stat -c%s "$PCK")
|
||||
echo ""
|
||||
echo "[export] 完成:"
|
||||
echo " $EXE ($((SIZE_EXE / 1024)) KiB, PE 头校验通过)"
|
||||
echo " $EXE ($((SIZE_EXE / 1024)) KiB, PE 头与版本资源校验通过)"
|
||||
echo " $PCK ($((SIZE_PCK / 1024)) KiB)"
|
||||
[ -f "$CONSOLE" ] && echo " $CONSOLE ($(( $(stat -c%s "$CONSOLE") / 1024 )) KiB)"
|
||||
echo ""
|
||||
|
||||
@@ -59,6 +59,12 @@ PCK_MAGIC=$(head -c 4 "$PCK" | tr -d '\0')
|
||||
[ "$PCK_MAGIC" = "GDPC" ] || die "$PCK 不是合法的 Godot 资源包(头 '$PCK_MAGIC')"
|
||||
log "源产物校验通过:exe PE 头 MZ | pck 头 GDPC"
|
||||
|
||||
# 产物 exe 的 PE 版本资源必须是本次发布版本 —— Windows「属性 → 详细信息」显示的就是它。
|
||||
# v0.2.1 曾带着 0.1.0 发出去(导出预设里是硬编码的旧值,且没有任何环节复核产物)。
|
||||
bash "$PROJECT_DIR/build/check-pe-version.sh" "$EXE" "$VERSION" \
|
||||
|| die "$EXE 的 PE 版本资源不是 v$VERSION;先跑 bash build/sync-export-version.sh $VERSION 再重新导出"
|
||||
log "产物 PE 版本资源校验通过(=$VERSION)"
|
||||
|
||||
# ---- 2. 整理产物 ----
|
||||
log "整理产物到 $STAGE …"
|
||||
rm -rf "$STAGE"
|
||||
@@ -123,6 +129,11 @@ CHECK_PCK=$(head -c 4 "$CHECK_DIR/$NAME/OpenDance.pck" | tr -d '\0')
|
||||
[ "$CHECK_PCK" = "GDPC" ] || die "解压后的 OpenDance.pck 不是合法 Godot 资源包"
|
||||
log "整包完整性自检通过(解压后 exe + pck 同目录,PE/GDPC 头均合法)"
|
||||
|
||||
# 再核一次**解压后**的 exe 版本资源:确认打包/解包环节没有换错文件
|
||||
bash "$PROJECT_DIR/build/check-pe-version.sh" "$CHECK_DIR/$NAME/OpenDance.exe" "$VERSION" \
|
||||
|| die "包内 exe 的 PE 版本资源不是 v$VERSION"
|
||||
log "包内 exe 的 PE 版本资源 = v$VERSION"
|
||||
|
||||
# pck 与 exe 必须同名同目录,否则 Godot 找不到资源
|
||||
[ "$(basename "$CHECK_DIR/$NAME/OpenDance.exe" .exe)" = "$(basename "$CHECK_DIR/$NAME/OpenDance.pck" .pck)" ] \
|
||||
|| die "exe 与 pck 主文件名不一致,导出产物不可运行"
|
||||
|
||||
Executable
+58
@@ -0,0 +1,58 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# OpenDance Studio —— 把当前版本号同步进 Godot 导出预设
|
||||
#
|
||||
# 为什么需要它:`export_presets.cfg` 的
|
||||
# application/file_version / application/product_version
|
||||
# 决定导出后 `OpenDance.exe` 的 PE `VERSIONINFO` 资源,也就是 Windows 上
|
||||
# 「右键 → 属性 → 详细信息」里显示的文件版本/产品版本。这两个键**不会**
|
||||
# 跟着 `project.godot` 的 `application/config/version` 自动走:
|
||||
# 它们当初被硬编码成 0.1.0 后一直没人改,导致 **v0.2.1 的包显示 0.1.0**。
|
||||
#
|
||||
# 因此发布前必须显式同步,并由 `build/check-pe-version.sh` 在产物上复核。
|
||||
#
|
||||
# 用法:
|
||||
# bash build/sync-export-version.sh [版本号] # 缺省取 project.yaml 的 version
|
||||
# ============================================================
|
||||
set -euo pipefail
|
||||
|
||||
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
PRESET="$PROJECT_DIR/export_presets.cfg"
|
||||
[ -f "$PRESET" ] || { echo "错误:缺少 $PRESET" >&2; exit 1; }
|
||||
|
||||
VERSION="${1:-$(sed -n 's/^version:[[:space:]]*//p' project.yaml | head -1)}"
|
||||
VERSION="${VERSION:-}"
|
||||
|
||||
if ! printf '%s' "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||
echo "错误:版本号必须形如 X.Y.Z(实际 '$VERSION')" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CHANGED=0
|
||||
for KEY in file_version product_version; do
|
||||
LINE="application/${KEY}=\"${VERSION}\""
|
||||
if grep -qE "^application/${KEY}=" "$PRESET"; then
|
||||
OLD=$(grep -E "^application/${KEY}=" "$PRESET" | head -1)
|
||||
if [ "$OLD" != "$LINE" ]; then
|
||||
# 用 sed 就地替换;值里只有数字和点,无需转义
|
||||
sed -i "s|^application/${KEY}=.*$|${LINE}|" "$PRESET"
|
||||
echo " application/${KEY}: ${OLD#*=} → \"${VERSION}\""
|
||||
CHANGED=1
|
||||
else
|
||||
echo " application/${KEY}: 已是 \"${VERSION}\""
|
||||
fi
|
||||
else
|
||||
# 预设里没有这一行就追加到 [preset.0.options] 段的末尾(application/ 键都在该段)
|
||||
printf '%s\n' "$LINE" >>"$PRESET"
|
||||
echo " application/${KEY}: 新增 \"${VERSION}\""
|
||||
CHANGED=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$CHANGED" -eq 1 ]; then
|
||||
echo "✓ 导出预设已同步到 v${VERSION}(重新导出后 PE 资源才会更新)"
|
||||
else
|
||||
echo "✓ 导出预设已是 v${VERSION},无需改动"
|
||||
fi
|
||||
+21
-4
@@ -26,7 +26,7 @@ fi
|
||||
FAILED=0
|
||||
|
||||
echo "============================================================"
|
||||
echo " 0/4 版本号一致性(project.godot / project.yaml)"
|
||||
echo " 0/5 版本号一致性(project.godot / project.yaml / export_presets.cfg)"
|
||||
echo "============================================================"
|
||||
if bash "$PROJECT_DIR/build/check-version.sh"; then
|
||||
:
|
||||
@@ -37,7 +37,24 @@ fi
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 1/4 脚本编译检查"
|
||||
echo " 1/5 产物 PE 版本资源(Windows 属性页显示的版本)"
|
||||
echo "============================================================"
|
||||
EXPORTED_EXE="$PROJECT_DIR/build/windows/OpenDance.exe"
|
||||
EXPECTED_VERSION="$(sed -n 's/^config\/version="\(.*\)"$/\1/p' "$PROJECT_DIR/project.godot" | head -1)"
|
||||
if [ -f "$EXPORTED_EXE" ]; then
|
||||
if bash "$PROJECT_DIR/build/check-pe-version.sh" "$EXPORTED_EXE" "$EXPECTED_VERSION"; then
|
||||
:
|
||||
else
|
||||
echo "✗ 已导出 exe 的 PE 版本资源与 v$EXPECTED_VERSION 不一致(属性页会显示错版本)"
|
||||
FAILED=1
|
||||
fi
|
||||
else
|
||||
echo "· 尚未导出 build/windows/OpenDance.exe,跳过(打包时 package-release.sh 会强制校验)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 2/5 脚本编译检查"
|
||||
echo "============================================================"
|
||||
IMPORT_LOG=$(mktemp)
|
||||
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --import >"$IMPORT_LOG" 2>&1
|
||||
@@ -52,7 +69,7 @@ rm -f "$IMPORT_LOG"
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 2/4 无头测试(单元 + 真实 API 集成)"
|
||||
echo " 3/5 无头测试(单元 + 真实 API 集成)"
|
||||
echo "============================================================"
|
||||
TEST_LOG=$(mktemp)
|
||||
"$GODOT_BIN" --headless --path "$PROJECT_DIR" --script res://tests/run_tests.gd >"$TEST_LOG" 2>&1
|
||||
@@ -69,7 +86,7 @@ rm -f "$TEST_LOG"
|
||||
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo " 3/4 应用启动检查(180 帧)"
|
||||
echo " 4/5 应用启动检查(180 帧)"
|
||||
echo "============================================================"
|
||||
RUN_LOG=$(mktemp)
|
||||
timeout 120 "$GODOT_BIN" --headless --path "$PROJECT_DIR" --quit-after 180 >"$RUN_LOG" 2>&1
|
||||
|
||||
Reference in New Issue
Block a user