gsproremote/scripts/dev.ps1

194 lines
7 KiB
PowerShell
Raw Normal View History

# GSPro Remote Development Script
# Starts both backend and frontend servers for development
Write-Host "GSPro Remote Development Environment" -ForegroundColor Green
Write-Host "=====================================" -ForegroundColor Green
Write-Host ""
# Check if Python is installed
$pythonVersion = python --version 2>$null
if (-not $pythonVersion) {
Write-Host "ERROR: Python is not installed or not in PATH" -ForegroundColor Red
Write-Host "Please install Python 3.11+ from https://www.python.org/" -ForegroundColor Yellow
exit 1
}
Write-Host "✓ Python found: $pythonVersion" -ForegroundColor Green
# Check if Node.js is installed
$nodeVersion = node --version 2>$null
if (-not $nodeVersion) {
Write-Host "ERROR: Node.js is not installed or not in PATH" -ForegroundColor Red
Write-Host "Please install Node.js 20+ from https://nodejs.org/" -ForegroundColor Yellow
exit 1
}
Write-Host "✓ Node.js found: $nodeVersion" -ForegroundColor Green
# Check if npm is installed
$npmVersion = npm --version 2>$null
if (-not $npmVersion) {
Write-Host "ERROR: npm is not installed or not in PATH" -ForegroundColor Red
exit 1
}
Write-Host "✓ npm found: $npmVersion" -ForegroundColor Green
Write-Host ""
# Get the script directory (project root)
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$projectRoot = Split-Path -Parent $scriptDir
$backendDir = Join-Path $projectRoot "backend"
$frontendDir = Join-Path $projectRoot "frontend"
# Function to check if a port is in use
function Test-Port {
param($port)
$tcpClient = New-Object System.Net.Sockets.TcpClient
try {
$tcpClient.Connect("localhost", $port)
$tcpClient.Close()
return $true
} catch {
return $false
}
}
# Check if backend port is already in use
if (Test-Port 5005) {
Write-Host "WARNING: Port 5005 is already in use. Backend server might already be running." -ForegroundColor Yellow
Write-Host "Do you want to continue anyway? (Y/N): " -NoNewline
$response = Read-Host
if ($response -ne "Y" -and $response -ne "y") {
exit 0
}
}
# Check if frontend port is already in use
if (Test-Port 5173) {
Write-Host "WARNING: Port 5173 is already in use. Frontend server might already be running." -ForegroundColor Yellow
Write-Host "Do you want to continue anyway? (Y/N): " -NoNewline
$response = Read-Host
if ($response -ne "Y" -and $response -ne "y") {
exit 0
}
}
# Setup backend
Write-Host "Setting up Backend..." -ForegroundColor Cyan
Set-Location $backendDir
# Check if virtual environment exists
$venvPath = Join-Path $backendDir ".venv"
if (-not (Test-Path $venvPath)) {
Write-Host "Creating Python virtual environment..." -ForegroundColor Yellow
python -m venv .venv
if ($LASTEXITCODE -ne 0) {
Write-Host "ERROR: Failed to create virtual environment" -ForegroundColor Red
exit 1
}
}
# Activate virtual environment and install dependencies
Write-Host "Installing backend dependencies..." -ForegroundColor Yellow
$activateScript = Join-Path $venvPath "Scripts\Activate.ps1"
if (Test-Path $activateScript) {
& $activateScript
} else {
Write-Host "ERROR: Virtual environment activation script not found" -ForegroundColor Red
exit 1
}
# Check if requirements are installed
$pipList = pip list 2>$null
if (-not ($pipList -like "*fastapi*")) {
Write-Host "Installing Python packages..." -ForegroundColor Yellow
pip install -e . 2>&1 | Out-Null
if ($LASTEXITCODE -ne 0) {
Write-Host "ERROR: Failed to install backend dependencies" -ForegroundColor Red
Write-Host "Try running: pip install -e . manually in the backend directory" -ForegroundColor Yellow
exit 1
}
}
Write-Host "✓ Backend dependencies installed" -ForegroundColor Green
# Setup frontend
Write-Host ""
Write-Host "Setting up Frontend..." -ForegroundColor Cyan
Set-Location $frontendDir
# Check if node_modules exists
if (-not (Test-Path "node_modules")) {
Write-Host "Installing frontend dependencies..." -ForegroundColor Yellow
npm install 2>&1 | Out-Null
if ($LASTEXITCODE -ne 0) {
Write-Host "ERROR: Failed to install frontend dependencies" -ForegroundColor Red
Write-Host "Try running: npm install manually in the frontend directory" -ForegroundColor Yellow
exit 1
}
}
Write-Host "✓ Frontend dependencies installed" -ForegroundColor Green
Write-Host ""
# Start servers
Write-Host "Starting Development Servers..." -ForegroundColor Cyan
Write-Host "================================" -ForegroundColor Cyan
Write-Host ""
# Start backend server in a new PowerShell window
Write-Host "Starting Backend Server on http://localhost:5005" -ForegroundColor Green
$backendScript = @"
Write-Host 'GSPro Remote Backend Server' -ForegroundColor Cyan
Write-Host '===========================' -ForegroundColor Cyan
Write-Host ''
Write-Host 'Server: http://localhost:5005' -ForegroundColor Yellow
Write-Host 'API Docs: http://localhost:5005/api/docs' -ForegroundColor Yellow
Write-Host 'mDNS: http://gsproapp.local:5005' -ForegroundColor Yellow
Write-Host ''
Set-Location '$backendDir'
& '$activateScript'
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 5005 --log-level info
"@
$backendScriptPath = Join-Path $env:TEMP "gspro-backend.ps1"
$backendScript | Out-File -FilePath $backendScriptPath -Encoding UTF8
Start-Process powershell -ArgumentList "-NoExit", "-ExecutionPolicy", "Bypass", "-File", $backendScriptPath
# Give backend a moment to start
Start-Sleep -Seconds 2
# Start frontend server in a new PowerShell window
Write-Host "Starting Frontend Server on http://localhost:5173" -ForegroundColor Green
$frontendScript = @"
Write-Host 'GSPro Remote Frontend Server' -ForegroundColor Cyan
Write-Host '============================' -ForegroundColor Cyan
Write-Host ''
Write-Host 'UI: http://localhost:5173' -ForegroundColor Yellow
Write-Host ''
Set-Location '$frontendDir'
npm run dev
"@
$frontendScriptPath = Join-Path $env:TEMP "gspro-frontend.ps1"
$frontendScript | Out-File -FilePath $frontendScriptPath -Encoding UTF8
Start-Process powershell -ArgumentList "-NoExit", "-ExecutionPolicy", "Bypass", "-File", $frontendScriptPath
Write-Host ""
Write-Host "Development servers starting..." -ForegroundColor Green
Write-Host ""
Write-Host "Access Points:" -ForegroundColor Cyan
Write-Host " Frontend UI: http://localhost:5173" -ForegroundColor White
Write-Host " Backend API: http://localhost:5005" -ForegroundColor White
Write-Host " API Docs: http://localhost:5005/api/docs" -ForegroundColor White
Write-Host " mDNS Access: http://gsproapp.local:5005" -ForegroundColor White
Write-Host ""
Write-Host "Press any key to stop watching for changes..." -ForegroundColor Yellow
# Wait for user input
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
# The servers are running in separate windows, so they'll keep running
# This script can exit, and the user can close the server windows manually
Write-Host ""
Write-Host "Note: The servers are still running in separate windows." -ForegroundColor Yellow
Write-Host "Close those windows to stop the servers." -ForegroundColor Yellow