133 lines
4.0 KiB
PowerShell
133 lines
4.0 KiB
PowerShell
# Starts the whole app: game server, Vite client and the Aspire dashboard.
|
|
# Skips MSBuild when AppHost and Server dlls are newer than C# / csproj / props.
|
|
# .\run-aspire.ps1
|
|
# .\run-aspire.ps1 --launch-profile http
|
|
# .\run-aspire.ps1 --rebuild
|
|
# .\run-aspire.ps1 --no-tailscale
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
$PSNativeCommandUseErrorActionPreference = $false
|
|
|
|
Set-Location -LiteralPath $PSScriptRoot
|
|
|
|
function Write-Log([string] $Message) {
|
|
Write-Host "[run-aspire] $Message"
|
|
}
|
|
|
|
function Write-TailscaleSkipped([string] $Why) {
|
|
Write-Log "WARNING: $Why"
|
|
Write-Host ' Friends cannot reach the client over the tailnet.'
|
|
Write-Host ' Continuing with local access only (http://localhost:5173).'
|
|
}
|
|
|
|
$configuration = 'Debug'
|
|
$rebuild = $false
|
|
$tailscaleServe = $true
|
|
$dotnetArgs = @()
|
|
$expectConfiguration = $false
|
|
|
|
foreach ($arg in $args) {
|
|
if ($expectConfiguration) {
|
|
$configuration = $arg
|
|
$expectConfiguration = $false
|
|
continue
|
|
}
|
|
|
|
switch ($arg) {
|
|
'--rebuild' { $rebuild = $true }
|
|
'--no-tailscale' { $tailscaleServe = $false }
|
|
{ $_ -in '-c', '--configuration' } { $expectConfiguration = $true }
|
|
default { $dotnetArgs += $arg }
|
|
}
|
|
}
|
|
|
|
if ($expectConfiguration) {
|
|
Write-Log 'missing value for -c / --configuration.'
|
|
exit 1
|
|
}
|
|
|
|
if (-not (Get-Command dotnet -ErrorAction SilentlyContinue)) {
|
|
Write-Log 'dotnet SDK not found in PATH.'
|
|
Write-Host ' Install .NET 10: https://dotnet.microsoft.com/download'
|
|
exit 1
|
|
}
|
|
|
|
if (-not (Get-Command node -ErrorAction SilentlyContinue)) {
|
|
Write-Log 'Node.js not found in PATH - the client resource will fail to start.'
|
|
Write-Host ' Install Node 22.12 or newer: https://nodejs.org'
|
|
Write-Host ''
|
|
}
|
|
|
|
if ($rebuild) {
|
|
Write-Log '--rebuild: building.'
|
|
$needBuild = $true
|
|
} else {
|
|
$stamp = Join-Path $PSScriptRoot 'tools\apphost-uptodate.ps1'
|
|
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File $stamp -RepoRoot $PSScriptRoot -Configuration $configuration
|
|
if ($LASTEXITCODE -eq 0) {
|
|
Write-Log 'binaries are up to date, skipping build.'
|
|
$needBuild = $false
|
|
} else {
|
|
Write-Log 'sources changed or binaries missing, building.'
|
|
$needBuild = $true
|
|
}
|
|
}
|
|
|
|
if ($needBuild) {
|
|
Write-Host ''
|
|
& dotnet build (Join-Path $PSScriptRoot 'src\HSchool.AppHost\HSchool.AppHost.csproj') -c $configuration
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Host ''
|
|
Write-Log 'build failed.'
|
|
exit $LASTEXITCODE
|
|
}
|
|
Write-Host ''
|
|
}
|
|
|
|
$clientTailscaleUrl = $null
|
|
if ($tailscaleServe) {
|
|
if (-not (Get-Command tailscale -ErrorAction SilentlyContinue)) {
|
|
Write-TailscaleSkipped 'tailscale not found in PATH.'
|
|
} else {
|
|
& tailscale status 2>$null | Out-Null
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-TailscaleSkipped 'tailscale is not connected or not running.'
|
|
} else {
|
|
Write-Log 'tailscale serve --bg 5173'
|
|
& tailscale serve --bg 5173
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-TailscaleSkipped 'tailscale serve failed.'
|
|
} else {
|
|
$line = & tailscale serve status 2>$null | Select-Object -First 1
|
|
$token = if ($line) { ($line -split '\s+', 2)[0] } else { $null }
|
|
if ($token -like 'https://*') {
|
|
$clientTailscaleUrl = $token
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Write-Host ''
|
|
}
|
|
|
|
Write-Log 'Starting the Aspire AppHost. Press Ctrl+C to shut everything down.'
|
|
Write-Log 'Client: http://localhost:5173'
|
|
if ($clientTailscaleUrl) {
|
|
Write-Log "Client (Tailscale): $clientTailscaleUrl"
|
|
}
|
|
Write-Host ''
|
|
|
|
$run = @(
|
|
'--project', (Join-Path $PSScriptRoot 'src\HSchool.AppHost\HSchool.AppHost.csproj')
|
|
'--no-build'
|
|
'--no-restore'
|
|
) + $dotnetArgs
|
|
& dotnet run @run
|
|
$exitCode = $LASTEXITCODE
|
|
if ($exitCode -ne 0) {
|
|
Write-Host ''
|
|
Write-Log "AppHost exited with code $exitCode."
|
|
}
|
|
|
|
exit $exitCode
|