#Requires -Version 5.1 <# .SYNOPSIS ZCLAW 开发环境快速启动脚本 .DESCRIPTION 检查依赖、启动后端服务、启动桌面端开发环境 .PARAMETER SkipBackend 跳过后端启动(假设后端已运行) .PARAMETER DesktopOnly 仅启动桌面端 .PARAMETER Stop 停止所有服务 .EXAMPLE .\scripts\quick-start-dev.ps1 .\scripts\quick-start-dev.ps1 -SkipBackend .\scripts\quick-start-dev.ps1 -Stop #> param( [switch]$SkipBackend, [switch]$DesktopOnly, [switch]$Stop ) $ErrorActionPreference = "Stop" $ProjectRoot = $PSScriptRoot | Split-Path -Parent # 颜色输出函数 function Write-Step { param([string]$Message) Write-Host "`n[STEP] $Message" -ForegroundColor Cyan } function Write-Success { param([string]$Message) Write-Host "[OK] $Message" -ForegroundColor Green } function Write-Warning { param([string]$Message) Write-Host "[WARN] $Message" -ForegroundColor Yellow } function Write-Error { param([string]$Message) Write-Host "[ERROR] $Message" -ForegroundColor Red } # 停止服务 if ($Stop) { Write-Step "停止所有服务..." # 停止 OpenFang $openfang = Get-Process -Name "openfang" -ErrorAction SilentlyContinue if ($openfang) { Stop-Process -Name "openfang" -Force -ErrorAction SilentlyContinue Write-Success "OpenFang 已停止" } # 停止 Vite $vite = Get-Process -Name "node" -ErrorAction SilentlyContinue | Where-Object { $_.MainWindowTitle -like "*vite*" -or $_.CommandLine -like "*vite*" } if ($vite) { $vite | Stop-Process -Force -ErrorAction SilentlyContinue Write-Success "Vite 进程已停止" } # 调用项目的停止脚本 $stopScript = Join-Path $ProjectRoot "start-all.ps1" if (Test-Path $stopScript) { & $stopScript -Stop } Write-Success "所有服务已停止" exit 0 } Write-Host "========================================" -ForegroundColor Cyan Write-Host " ZCLAW Development Quick Start" -ForegroundColor Cyan Write-Host "========================================" -ForegroundColor Cyan # 1. 检查 Node.js Write-Step "检查 Node.js..." try { $nodeVersion = node -v if ($nodeVersion -match "v(\d+)") { $majorVersion = [int]$Matches[1] if ($majorVersion -lt 18) { Write-Error "Node.js 版本过低: $nodeVersion (需要 18+)" Write-Host "请从 https://nodejs.org 安装最新版本" exit 1 } Write-Success "Node.js $nodeVersion" } } catch { Write-Error "未找到 Node.js,请从 https://nodejs.org 安装" exit 1 } # 2. 检查 pnpm Write-Step "检查 pnpm..." try { $pnpmVersion = pnpm -v Write-Success "pnpm $pnpmVersion" } catch { Write-Warning "未找到 pnpm,正在安装..." npm install -g pnpm if ($LASTEXITCODE -ne 0) { Write-Error "pnpm 安装失败" exit 1 } Write-Success "pnpm 安装完成" } # 3. 检查依赖安装 Write-Step "检查依赖..." $nodeModules = Join-Path $ProjectRoot "node_modules" $desktopModules = Join-Path $ProjectRoot "desktop\node_modules" if (-not (Test-Path $nodeModules)) { Write-Host "安装根目录依赖..." Push-Location $ProjectRoot pnpm install Pop-Location } if (-not (Test-Path $desktopModules)) { Write-Host "安装桌面端依赖..." Push-Location (Join-Path $ProjectRoot "desktop") pnpm install Pop-Location } Write-Success "依赖已就绪" # 4. 检查/启动后端 if (-not $SkipBackend -and -not $DesktopOnly) { Write-Step "检查后端服务..." $backendRunning = $false try { $response = Invoke-WebRequest -Uri "http://127.0.0.1:50051/api/health" -TimeoutSec 2 -UseBasicParsing -ErrorAction SilentlyContinue if ($response.StatusCode -eq 200) { $backendRunning = $true Write-Success "后端服务已运行" } } catch { # 后端未运行 } if (-not $backendRunning) { Write-Host "启动 OpenFang 后端..." # 尝试多种方式启动 $started = $false # 方式 1: 使用 openfang CLI try { $openfangCmd = Get-Command "openfang" -ErrorAction SilentlyContinue if ($openfangCmd) { Start-Process -FilePath "openfang" -ArgumentList "start" -NoNewWindow $started = $true } } catch {} # 方式 2: 使用 pnpm 脚本 if (-not $started) { $startScript = Join-Path $ProjectRoot "start-all.ps1" if (Test-Path $startScript) { Start-Process -FilePath "powershell" -ArgumentList "-ExecutionPolicy", "Bypass", "-File", $startScript -NoNewWindow $started = $true } } if (-not $started) { Write-Error "无法启动后端服务" Write-Host "请手动启动 OpenFang:" Write-Host " openfang start" Write-Host " 或运行 start-all.ps1" exit 1 } # 等待后端启动 Write-Host "等待后端启动..." $retries = 0 $maxRetries = 15 while ($retries -lt $maxRetries) { Start-Sleep -Seconds 1 try { $response = Invoke-WebRequest -Uri "http://127.0.0.1:50051/api/health" -TimeoutSec 2 -UseBasicParsing -ErrorAction SilentlyContinue if ($response.StatusCode -eq 200) { Write-Success "后端服务启动成功" break } } catch {} $retries++ Write-Host "." -NoNewline } if ($retries -ge $maxRetries) { Write-Error "后端启动超时" Write-Host "请检查 OpenFang 是否正确安装" exit 1 } } } # 5. 启动开发环境 Write-Step "启动开发环境..." Push-Location $ProjectRoot if ($DesktopOnly) { Write-Host "仅启动桌面端..." pnpm desktop } else { Write-Host "启动完整开发环境..." pnpm start:dev } Pop-Location