113 lines
4.0 KiB
PowerShell
113 lines
4.0 KiB
PowerShell
<#
|
||
.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
|