feat(win): T-WIN-011 Windows 打包与一键验证脚本

This commit is contained in:
2026-09-14 20:04:54 +08:00
parent 13d6dc915d
commit 315cf79708
5 changed files with 433 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
<#
.SYNOPSIS
OpenDance Studio —— Windows 客户端导出(在 Windows 上执行)
.DESCRIPTION
文档 §5.3 方案 B(兜底):若因插件或引擎限制无法在 Linux 导出,
由用户在 Windows 端执行本脚本。
前置:
1. 已安装 Godot 4 并将其加入 PATH,或用 -GodotBin 指定完整路径
2. 已安装对应版本的 export templates
(Godot 编辑器 → 编辑器 → 管理导出模板 → 下载并安装)
.PARAMETER GodotBin
Godot 可执行文件路径,默认 "godot"
.PARAMETER OutputDir
产物输出目录,默认 ".\build\windows"
.PARAMETER Mode
release 或 debug,默认 release
.EXAMPLE
powershell -ExecutionPolicy Bypass -File build\export-windows.ps1
powershell -ExecutionPolicy Bypass -File build\export-windows.ps1 -GodotBin "C:\Godot\godot.exe"
#>
param(
[string]$GodotBin = "godot",
[string]$OutputDir = ".\build\windows",
[ValidateSet("release", "debug")]
[string]$Mode = "release"
)
$ErrorActionPreference = "Stop"
$ProjectDir = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
Set-Location $ProjectDir
Write-Host "[export] 项目:$ProjectDir"
Write-Host "[export] Godot:$GodotBin"
Write-Host "[export] 模式:$Mode"
# ---- 定位 Godot ----
$godotCmd = Get-Command $GodotBin -ErrorAction SilentlyContinue
if (-not $godotCmd -and -not (Test-Path $GodotBin)) {
Write-Error "未找到 Godot 可执行文件「$GodotBin」。请安装 Godot 4 或用 -GodotBin 指定完整路径。"
exit 1
}
$GodotExe = if ($godotCmd) { $godotCmd.Source } else { $GodotBin }
$version = & $GodotExe --version 2>$null | Select-Object -First 1
Write-Host "[export] 版本:$version"
# ---- 导出预设必须位于项目根目录 ----
if (-not (Test-Path (Join-Path $ProjectDir "export_presets.cfg"))) {
$fallback = Join-Path $ProjectDir "build\export_presets.cfg"
if (Test-Path $fallback) {
Copy-Item $fallback (Join-Path $ProjectDir "export_presets.cfg")
Write-Host "[export] 已从 build\ 复制导出预设到项目根目录"
} else {
Write-Error "缺少 export_presets.cfg(Godot 要求放在项目根目录)。"
exit 1
}
}
# ---- 检查导出模板 ----
$templateDir = Join-Path $env:APPDATA "Godot\export_templates"
if (-not (Test-Path $templateDir) -or (Get-ChildItem $templateDir -ErrorAction SilentlyContinue).Count -eq 0) {
Write-Error "未找到导出模板($templateDir)。请在 Godot 编辑器中选择「编辑器 → 管理导出模板」下载安装。"
exit 1
}
Write-Host "[export] 导出模板:$((Get-ChildItem $templateDir | Select-Object -ExpandProperty Name) -join ', ')"
if (-not (Test-Path $OutputDir)) {
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
}
# ---- 导入资源 ----
Write-Host "[export] 导入资源…"
& $GodotExe --headless --path $ProjectDir --import 2>&1 | Out-Null
# ---- 导出 ----
Write-Host "[export] 导出中…"
$exePath = Join-Path $OutputDir "OpenDance.exe"
& $GodotExe --headless --path $ProjectDir --export-$Mode "Windows Desktop" $exePath
if ($LASTEXITCODE -ne 0) {
Write-Host "[export] 导出命令返回 $LASTEXITCODE,检查产物是否存在…"
}
# ---- 校验产物 ----
$pckPath = Join-Path $OutputDir "OpenDance.pck"
$missing = $false
if (-not (Test-Path $exePath)) { Write-Error "未生成 $exePath"; $missing = $true }
if (-not (Test-Path $pckPath)) { Write-Error "未生成 $pckPath"; $missing = $true }
if ($missing) { exit 1 }
# 校验 PE 头(MZ)
$bytes = [System.IO.File]::ReadAllBytes($exePath)[0..1]
if ($bytes[0] -ne 0x4D -or $bytes[1] -ne 0x5A) {
Write-Error "$exePath 不是合法的 Windows PE 文件。"
exit 1
}
$exeSize = [math]::Round((Get-Item $exePath).Length / 1KB)
$pckSize = [math]::Round((Get-Item $pckPath).Length / 1KB)
Write-Host ""
Write-Host "[export] 完成:" -ForegroundColor Green
Write-Host " $exePath ($exeSize KiB, PE 头校验通过)"
Write-Host " $pckPath ($pckSize KiB)"
Write-Host ""
Write-Host "在 Windows 10/11 上运行 OpenDance.exe 即可(.pck 必须与 .exe 同目录)。"
exit 0