在前后端开发联调前 的提交20260223
This commit is contained in:
230
scripts/server/init-server-env.ps1
Normal file
230
scripts/server/init-server-env.ps1
Normal file
@@ -0,0 +1,230 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
服务器环境初始化脚本:删除 skip-worktree 排除的文件/目录 + 创建 export 目录树。
|
||||
|
||||
.DESCRIPTION
|
||||
在服务器上 git clone + setup-server-git.py 之后运行。
|
||||
1. 删除已被 skip-worktree 标记的目录和散文件(释放磁盘空间)
|
||||
2. 创建完整的 export/ 目录树(ETL/SYSTEM/BACKEND 三大类)
|
||||
|
||||
三个环境都需要 export 目录(LOG、JSON、REPORTS 等运行时输出在每个环境都会产生)。
|
||||
|
||||
.PARAMETER Envs
|
||||
要初始化的环境列表,默认 test,prod。
|
||||
可选值:test, prod(逗号分隔)。
|
||||
|
||||
.EXAMPLE
|
||||
# 初始化 test + prod(默认)
|
||||
.\init-server-env.ps1
|
||||
|
||||
# 只初始化 test
|
||||
.\init-server-env.ps1 -Envs test
|
||||
|
||||
# 只初始化 prod
|
||||
.\init-server-env.ps1 -Envs prod
|
||||
#>
|
||||
|
||||
param(
|
||||
[string[]]$Envs = @("test", "prod")
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# ============================================================================
|
||||
# 配置
|
||||
# ============================================================================
|
||||
|
||||
# 服务器根目录
|
||||
$ServerRoot = "D:\NeoZQYY"
|
||||
|
||||
# 环境 → repo 路径映射
|
||||
$EnvPaths = @{
|
||||
"test" = "$ServerRoot\test\repo"
|
||||
"prod" = "$ServerRoot\prod\repo"
|
||||
}
|
||||
|
||||
# skip-worktree 后可安全删除的目录(与 setup-server-git.py DELETABLE_DIRS 一致)
|
||||
$DeletableDirs = @(
|
||||
"export"
|
||||
"docs"
|
||||
"tests"
|
||||
"samples"
|
||||
"infra"
|
||||
".kiro"
|
||||
".hypothesis"
|
||||
".pytest_cache"
|
||||
"apps\miniprogram"
|
||||
"scripts\ops"
|
||||
"scripts\audit"
|
||||
"scripts\migrate"
|
||||
)
|
||||
|
||||
# 可安全删除的根目录散文件(与 setup-server-git.py SKIP_PREFIXES 中的散文件一致)
|
||||
$DeletableFiles = @(
|
||||
"coach-detail-full.png"
|
||||
"customer-detail-full.png"
|
||||
"perf-records-current.png"
|
||||
"white-screen-debug.png"
|
||||
"NeoZQYY.code-workspace"
|
||||
"start-admin.bat"
|
||||
".kiroignore"
|
||||
)
|
||||
|
||||
# export 目录树(所有环境通用,运行时输出在每个环境都会产生)
|
||||
$ExportDirs = @(
|
||||
"export\ETL-Connectors\feiqiu\JSON"
|
||||
"export\ETL-Connectors\feiqiu\LOGS"
|
||||
"export\ETL-Connectors\feiqiu\REPORTS"
|
||||
"export\SYSTEM\LOGS"
|
||||
"export\SYSTEM\REPORTS\dataflow_analysis"
|
||||
"export\SYSTEM\REPORTS\field_audit"
|
||||
"export\SYSTEM\REPORTS\full_dataflow_doc"
|
||||
"export\SYSTEM\CACHE\api_samples"
|
||||
"export\BACKEND\LOGS"
|
||||
)
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# 函数
|
||||
# ============================================================================
|
||||
|
||||
function Remove-SkipWorktreeItems {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
删除指定 repo 下已被 skip-worktree 标记的目录和散文件。
|
||||
#>
|
||||
param([string]$RepoPath)
|
||||
|
||||
Write-Host "`n [删除] 清理 skip-worktree 排除的目录和文件..." -ForegroundColor Yellow
|
||||
|
||||
$freedMB = 0
|
||||
|
||||
# 删除目录
|
||||
foreach ($dir in $DeletableDirs) {
|
||||
$fullPath = Join-Path $RepoPath $dir
|
||||
if (Test-Path $fullPath) {
|
||||
$size = (Get-ChildItem $fullPath -Recurse -File -ErrorAction SilentlyContinue |
|
||||
Measure-Object -Property Length -Sum).Sum
|
||||
$sizeMB = [math]::Round($size / 1MB, 1)
|
||||
Remove-Item $fullPath -Recurse -Force
|
||||
Write-Host " 已删除: $dir/ ($sizeMB MB)" -ForegroundColor Red
|
||||
$freedMB += $sizeMB
|
||||
} else {
|
||||
Write-Host " 跳过: $dir/ (不存在)" -ForegroundColor DarkGray
|
||||
}
|
||||
}
|
||||
|
||||
# 删除散文件
|
||||
foreach ($file in $DeletableFiles) {
|
||||
$fullPath = Join-Path $RepoPath $file
|
||||
if (Test-Path $fullPath) {
|
||||
$size = (Get-Item $fullPath).Length
|
||||
$sizeMB = [math]::Round($size / 1MB, 2)
|
||||
Remove-Item $fullPath -Force
|
||||
Write-Host " 已删除: $file ($sizeMB MB)" -ForegroundColor Red
|
||||
$freedMB += $sizeMB
|
||||
}
|
||||
}
|
||||
|
||||
# 删除根目录下所有 .png 文件(server-exclude.txt 中 *.png 规则)
|
||||
Get-ChildItem $RepoPath -Filter "*.png" -File -ErrorAction SilentlyContinue | ForEach-Object {
|
||||
$sizeMB = [math]::Round($_.Length / 1MB, 2)
|
||||
Remove-Item $_.FullName -Force
|
||||
Write-Host " 已删除: $($_.Name) ($sizeMB MB)" -ForegroundColor Red
|
||||
$freedMB += $sizeMB
|
||||
}
|
||||
|
||||
Write-Host " 共释放: $freedMB MB" -ForegroundColor Green
|
||||
}
|
||||
|
||||
function New-ExportTree {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
在指定 repo 下创建完整的 export 目录树。
|
||||
#>
|
||||
param([string]$RepoPath)
|
||||
|
||||
Write-Host "`n [创建] 初始化 export 目录树..." -ForegroundColor Yellow
|
||||
|
||||
foreach ($dir in $ExportDirs) {
|
||||
$fullPath = Join-Path $RepoPath $dir
|
||||
if (-not (Test-Path $fullPath)) {
|
||||
New-Item -ItemType Directory -Path $fullPath -Force | Out-Null
|
||||
Write-Host " 已创建: $dir/" -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host " 已存在: $dir/" -ForegroundColor DarkGray
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Test-GitSetup {
|
||||
<#
|
||||
.SYNOPSIS
|
||||
检查 setup-server-git.py 是否已运行(通过检查 .git/info/exclude 内容)。
|
||||
#>
|
||||
param([string]$RepoPath)
|
||||
|
||||
$excludeFile = Join-Path $RepoPath ".git\info\exclude"
|
||||
if (-not (Test-Path $excludeFile)) {
|
||||
return $false
|
||||
}
|
||||
$content = Get-Content $excludeFile -Raw -ErrorAction SilentlyContinue
|
||||
return ($content -match "server-exclude")
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# 主流程
|
||||
# ============================================================================
|
||||
|
||||
Write-Host "============================================" -ForegroundColor White
|
||||
Write-Host " NeoZQYY 服务器环境初始化" -ForegroundColor White
|
||||
Write-Host " 目标环境: $($Envs -join ', ')" -ForegroundColor White
|
||||
Write-Host "============================================" -ForegroundColor White
|
||||
|
||||
foreach ($env in $Envs) {
|
||||
$repoPath = $EnvPaths[$env]
|
||||
|
||||
if (-not $repoPath) {
|
||||
Write-Host "`n[错误] 未知环境: $env(可选: test, prod)" -ForegroundColor Red
|
||||
continue
|
||||
}
|
||||
|
||||
Write-Host "`n========== 环境: $env ==========" -ForegroundColor Magenta
|
||||
Write-Host " 路径: $repoPath"
|
||||
|
||||
# 检查 repo 是否存在
|
||||
if (-not (Test-Path $repoPath)) {
|
||||
Write-Host " [警告] 目录不存在,跳过。请先 git clone。" -ForegroundColor Yellow
|
||||
continue
|
||||
}
|
||||
|
||||
# 检查 setup-server-git.py 是否已运行
|
||||
if (-not (Test-GitSetup $repoPath)) {
|
||||
Write-Host " [警告] 未检测到 setup-server-git.py 的配置。" -ForegroundColor Yellow
|
||||
Write-Host " 建议先运行: python scripts/server/setup-server-git.py" -ForegroundColor Yellow
|
||||
$answer = Read-Host " 是否继续删除操作?(y/N)"
|
||||
if ($answer -ne "y" -and $answer -ne "Y") {
|
||||
Write-Host " 已跳过 $env 环境的删除操作。" -ForegroundColor DarkGray
|
||||
# 仍然创建 export 目录
|
||||
New-ExportTree -RepoPath $repoPath
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
# 步骤 1:删除排除的文件/目录
|
||||
Remove-SkipWorktreeItems -RepoPath $repoPath
|
||||
|
||||
# 步骤 2:创建 export 目录树
|
||||
New-ExportTree -RepoPath $repoPath
|
||||
|
||||
Write-Host "`n [完成] $env 环境初始化完毕。" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host "`n============================================" -ForegroundColor White
|
||||
Write-Host " 全部完成。" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host " 后续步骤:" -ForegroundColor White
|
||||
Write-Host " 1. 手动创建各环境的 .env 文件(参考 .env.template)" -ForegroundColor White
|
||||
Write-Host " 2. 确认 .env 中的 export 路径指向 repo/export/ 下对应子目录" -ForegroundColor White
|
||||
Write-Host " 3. 运行 uv sync --all-packages 安装依赖" -ForegroundColor White
|
||||
Write-Host "============================================" -ForegroundColor White
|
||||
Reference in New Issue
Block a user