Files
csm/dev.ps1
iven b5333d8c93 feat: 添加新插件支持及多项功能改进
- 新增磁盘加密、打印审计和剪贴板管控插件支持
- 优化水印插件显示效果,支持中文及更多Unicode字符
- 改进硬件资产收集逻辑,更准确获取磁盘和显卡信息
- 增强API错误处理,添加详细日志记录
- 完善前端界面,新增插件管理页面
- 修复多个UI问题,优化页面过渡效果
- 添加环境变量覆盖配置功能
- 实现插件状态管理API
- 更新文档和变更日志
- 添加安装程序脚本支持
2026-04-10 22:21:05 +08:00

149 lines
4.6 KiB
PowerShell

<#
.SYNOPSIS
CSM 开发环境一键启动脚本
.DESCRIPTION
并行启动后端服务、前端 dev server 和客户端。
Ctrl+C 一次停止所有进程。
.USAGE
.\dev.ps1 # 启动全部 (server + web + client)
.\dev.ps1 -NoClient # 只启动 server + web
#>
param(
[switch]$NoClient
)
$ErrorActionPreference = "Stop"
$projectRoot = $PSScriptRoot
if (-not $projectRoot) { $projectRoot = $PWD.Path }
Write-Host ""
Write-Host "======================================" -ForegroundColor Cyan
Write-Host " CSM Dev Launcher" -ForegroundColor Cyan
Write-Host "======================================" -ForegroundColor Cyan
Write-Host ""
# --- Ensure frontend dependencies ---
if (-not (Test-Path "$projectRoot\web\node_modules")) {
Write-Host "[web] Installing dependencies..." -ForegroundColor Yellow
Push-Location "$projectRoot\web"
npm install
Pop-Location
}
# --- Ensure data directory ---
$dataDir = Join-Path $projectRoot "data"
if (-not (Test-Path $dataDir)) {
New-Item -ItemType Directory -Path $dataDir | Out-Null
Write-Host "[server] Created data directory" -ForegroundColor Green
}
# --- Build workspace first ---
Write-Host "[build] Compiling workspace..." -ForegroundColor Yellow
$buildOutput = cargo build --workspace 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "[build] FAILED" -ForegroundColor Red
Write-Host $buildOutput
exit 1
}
Write-Host "[build] OK" -ForegroundColor Green
Write-Host ""
# --- Track child processes ---
$script:processes = [System.Collections.Generic.List[System.Diagnostics.Process]]::new()
function Start-Proc {
param(
[string]$Name,
[string]$FilePath,
[string[]]$ArgumentList,
[string]$WorkingDirectory = $projectRoot
)
$proc = [System.Diagnostics.Process]::new()
$proc.StartInfo.FileName = $FilePath
$proc.StartInfo.ArgumentList.Clear()
foreach ($arg in $ArgumentList) {
$proc.StartInfo.ArgumentList.Add($arg)
}
$proc.StartInfo.WorkingDirectory = $WorkingDirectory
$proc.StartInfo.UseShellExecute = $false
$proc.StartInfo.RedirectStandardOutput = $false
$proc.StartInfo.RedirectStandardError = $false
$proc.Start() | Out-Null
$script:processes.Add($proc)
Write-Host " [$Name] PID $($proc.Id) started" -ForegroundColor Green
}
# --- Cleanup on exit ---
$script:cleaningUp = $false
function Cleanup {
if ($script:cleaningUp) { return }
$script:cleaningUp = $true
Write-Host ""
Write-Host "Stopping all services..." -ForegroundColor Yellow
foreach ($p in $script:processes) {
if (-not $p.HasExited) {
try {
$p.Kill($true)
Write-Host " Stopped PID $($p.Id)" -ForegroundColor DarkGray
} catch {
# already exited
}
}
}
Write-Host "All services stopped." -ForegroundColor Yellow
}
# Register cleanup on script exit (Ctrl+C, terminal close)
[Console]::TreatControlCAsInput = $false
$null = Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action { Cleanup }
try {
# --- Start Server ---
Write-Host "Starting services:" -ForegroundColor Cyan
Start-Proc -Name "server" -FilePath "cargo" -ArgumentList "run", "-p", "csm-server"
# Give server a moment to bind ports
Start-Sleep -Milliseconds 1500
# --- Start Frontend ---
Start-Proc -Name "web" -FilePath "npm" -ArgumentList "run", "dev" -WorkingDirectory "$projectRoot\web"
# --- Start Client ---
if (-not $NoClient) {
Start-Sleep -Milliseconds 500
Start-Proc -Name "client" -FilePath "cargo" -ArgumentList "run", "-p", "csm-client"
}
Write-Host ""
Write-Host "--------------------------------------" -ForegroundColor Cyan
Write-Host " Server : http://localhost:9998" -ForegroundColor White
Write-Host " Web UI : http://localhost:9997" -ForegroundColor White
Write-Host " TCP : localhost:9999" -ForegroundColor White
Write-Host "--------------------------------------" -ForegroundColor Cyan
Write-Host ""
Write-Host "Press Ctrl+C to stop all services." -ForegroundColor DarkGray
Write-Host ""
# --- Wait for any process to exit ---
$handles = $script:processes | ForEach-Object { $_.Handle }
$index = [System.Threading.WaitHandle]::WaitAny($handles)
$exited = $script:processes[$index]
$names = @("server", "web", "client")
$name = if ($index -lt $names.Count) { $names[$index] } else { "unknown" }
if ($exited.ExitCode -ne 0) {
Write-Host "[$name] exited with code $($exited.ExitCode)" -ForegroundColor Red
}
}
finally {
Cleanup
}