#!/bin/bash # ============================================================ # OpenDance Studio —— Windows 客户端版本号一致性校验 # # 文档 §11.2「单一来源 / 可核对」在本端的落点: # * `project.godot` 的 `application/config/version` 是**运行时唯一来源** # (「关于」清单直接读它,导出后打进 .pck); # * `project.yaml` 的 `version` 是任务清单/发布记录的来源; # * 发布产物文件名 `opendance-windows-vX.Y.Z.zip` 与 Git tag 必须一致。 # # 三者一旦漂移,就会出现"界面显示 v0.2.0、产物却叫 v0.2.1"这种不可核对的发布, # 因此打包前强制校验。 # # 用法:bash build/check-version.sh [期望版本号] # ============================================================ set -uo pipefail PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" 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 ' 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 fi if [ -n "$YAML_VERSION" ] && [ "$GODOT_VERSION" != "$YAML_VERSION" ]; then echo " ✗ project.godot 与 project.yaml 版本不一致" >&2 FAILED=1 fi # 版本号格式 X.Y.Z if [ -n "$GODOT_VERSION" ] && ! printf '%s' "$GODOT_VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then echo " ✗ 版本号应为 X.Y.Z(实际 $GODOT_VERSION)" >&2 FAILED=1 fi if [ "$FAILED" -ne 0 ]; then echo " ✗ 版本一致性校验失败" >&2 exit 1 fi echo " ✓ 版本一致:v$GODOT_VERSION(project.godot = project.yaml = export_presets.cfg${EXPECTED:+ = 期望值})"