Files
h-school/run-aspire.ps1
Leonid PershinandCursor d8d042349a Close gaps in off-queue DX 49/54/55.
Pass -c through to dotnet run so Release stamp and process match, assert changelog order for more than one commit, and restore the last school tab from sessionStorage when opening from the menu.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 17:10:01 +03:00

134 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'
'-c', $configuration
) + $dotnetArgs
& dotnet run @run
$exitCode = $LASTEXITCODE
if ($exitCode -ne 0) {
Write-Host ''
Write-Log "AppHost exited with code $exitCode."
}
exit $exitCode