Files
moonwell-client-core/scripts/deploy-moonwell.ps1
T
sindoring da72c705f1 Integrate MoonWell launcher and deployment tools
Integrate the MoonWell launcher and deployment tooling on the local upstream baseline d0d1b5de. Correct the shipped icon path, regenerate the code map, and make source/Lua gates portable to Windows. Classify launcher startup icon access as input plumbing.

Verified on Windows: scripts/gates.sh ALL GATES GREEN; MoonWell release build without dev; 12 deployment tests; deployment and packaging script syntax. Stock MPQ chain excludes the custom patch-3. Thirty-one addon tests skip per data-enabled rung because the corpus is absent. Native macOS/Linux and live login smoke were not run; no declared test account is available.
2026-10-08 14:01:54 +03:00

95 lines
4.5 KiB
PowerShell

[CmdletBinding()]
param(
[string]$DataPath = '',
[string]$IconPath = '',
[string]$PatchSource = '',
[string]$AuthHost = '',
[string]$EnvFile = '',
[string]$PackagePath = '',
[string]$BinaryPath = '',
[string]$VcRuntimePath = '',
[string]$Prefix = 'World of Warcraft 1.12.1',
[string]$ManifestKey = 'manifest-1.12.1.json',
[switch]$Publish,
[switch]$DryRun,
[switch]$SkipClientBuild
)
$ErrorActionPreference = 'Stop'
$repoRoot = Split-Path $PSScriptRoot -Parent
if (-not $EnvFile) {
$EnvFile = Join-Path (Split-Path $repoRoot -Parent) 'MoonWellClientSources\.env'
}
if (-not $PackagePath) {
$PackagePath = Join-Path $repoRoot ('dist\moonwell-' + (Get-Date -Format 'yyyyMMdd-HHmmss'))
}
if (-not $BinaryPath) { $BinaryPath = Join-Path $repoRoot 'target\release\MoonWell.exe' }
if ($BinaryPath.EndsWith('.exe', [StringComparison]::OrdinalIgnoreCase)) {
if (-not $VcRuntimePath) {
$vswherePath = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio\Installer\vswhere.exe'
$vsInstall = (& $vswherePath -latest -products '*' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath).Trim()
if ($LASTEXITCODE -ne 0 -or -not $vsInstall) { throw 'Visual Studio C++ runtime was not found; pass -VcRuntimePath.' }
$redistVersion = Get-ChildItem -LiteralPath (Join-Path $vsInstall 'VC\Redist\MSVC') -Directory |
Where-Object { $_.Name -match '^\d+\.\d+\.\d+$' } |
Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1
$VcRuntimePath = Join-Path $redistVersion.FullName 'x64\Microsoft.VC143.CRT'
}
if (-not (Test-Path -LiteralPath (Join-Path $VcRuntimePath 'vcruntime140.dll') -PathType Leaf)) {
throw 'The x64 Visual C++ redistributable vcruntime140.dll was not found.'
}
}
if (-not $DataPath -or -not $AuthHost) {
throw 'Pass -DataPath pointing to WoW 1.12.1 Data and -AuthHost host[:port]. WOW_HOME from the old .env is deliberately not used.'
}
if ($Publish -and $DryRun) { throw 'Choose -Publish or -DryRun.' }
if (Test-Path -LiteralPath $PackagePath) { throw 'PackagePath already exists; choose a new staging directory.' }
if (($Publish -or $DryRun) -and -not (Test-Path -LiteralPath $EnvFile -PathType Leaf)) {
throw 'Deployment .env was not found.'
}
Push-Location $repoRoot
try {
if (-not $SkipClientBuild) {
$embeddedIcon = Join-Path $repoRoot 'crates\moonwell\assets\moonwell.ico'
if ($IconPath) {
$sourceIcon = (Resolve-Path -LiteralPath $IconPath).Path
New-Item -ItemType Directory -Path (Split-Path $embeddedIcon -Parent) -Force | Out-Null
if ($sourceIcon -ne $embeddedIcon) { Copy-Item -LiteralPath $sourceIcon -Destination $embeddedIcon }
}
if (-not (Test-Path -LiteralPath $embeddedIcon -PathType Leaf)) {
throw 'Provide the MoonWell icon with -IconPath or place it in crates/moonwell/assets/moonwell.ico.'
}
& cargo build -p moonwell --release --no-default-features --locked
if ($LASTEXITCODE -ne 0) { throw 'MoonWell player build failed.' }
}
& cargo build -p moonwell-deploy --release --locked
if ($LASTEXITCODE -ne 0) { throw 'Rust deployment tool build failed.' }
$toolPath = Join-Path $repoRoot 'target\release\moonwell-deploy.exe'
$stageArguments = @('stage', '--binary', $BinaryPath, '--data', $DataPath,
'--output', $PackagePath, '--auth-host', $AuthHost)
if ($PatchSource) { $stageArguments += @('--source', $PatchSource) }
& $toolPath @stageArguments
if ($LASTEXITCODE -ne 0) { throw 'Package staging failed.' }
if ($BinaryPath.EndsWith('.exe', [StringComparison]::OrdinalIgnoreCase)) {
Copy-Item -LiteralPath (Join-Path $VcRuntimePath 'vcruntime140.dll') -Destination (Join-Path $PackagePath 'vcruntime140.dll')
}
# The local inventory lives outside the package, so it cannot list itself.
$inventoryPath = $PackagePath + '.manifest.json'
& $toolPath manifest --dir $PackagePath --output $inventoryPath
if ($LASTEXITCODE -ne 0) { throw 'Manifest generation failed.' }
if ($Publish -or $DryRun) {
$publishArguments = @('publish', '--dir', $PackagePath, '--env-file', $EnvFile,
'--prefix', $Prefix, '--manifest-key', $ManifestKey)
if ($DryRun) { $publishArguments += '--dry-run' }
& $toolPath @publishArguments
if ($LASTEXITCODE -ne 0) { throw 'S3 publication failed.' }
}
Write-Host "Package: $PackagePath"
Write-Host "Local manifest: $inventoryPath"
} finally {
Pop-Location
}