yeg
2026-09-17 f7a18613438ce6fbac6a7e2525e5a955cb83cf29
fix(scripts): 测试脚本的 -Clean 与 PowerShell 5.1 兼容

两个坑都是实测出来的,且都让文档里写着的用法跑不通:

- -Clean 必然失败:它把 clean 并进同一次 Maven 调用,而日志文件就在 target\ 下、被脚本自己的
`*>` 重定向一直打开着,clean 删不掉它直接报 Failed to delete target\server-tests.log。
现在 clean 单独先跑,跑完补回被删掉的 target\ 目录(不补的话重定向无处可写,而且 $LASTEXITCODE
会留着上一次的值、静默变成假成功,所以顺带加了日志为空的兜底判定)。
- PowerShell 5.1 会把 Maven 打到 stderr 的 JVM 警告当成终止错误,在编译中途掐断整个构建。Maven 的
退出码才是唯一判据,所以调用期间放宽 ErrorActionPreference,结束后再恢复。

两种 shell、带不带 -Clean 都已实测:6 项用例跑通。
1个文件已修改
21 ■■■■■ 已修改文件
talent-card-server/scripts/run-server-tests.ps1 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
talent-card-server/scripts/run-server-tests.ps1
@@ -52,18 +52,35 @@
    }
    $goals = @('test')
    if ($Clean) { $goals = @('clean') + $goals }
    $arguments = @('-o') + $goals
    if ($Test.Count -gt 0) { $arguments += ('-Dtest=' + ($Test -join ',')) }
    $arguments += '-DfailIfNoTests=false'
    $log = Join-Path $serverRoot 'target\server-tests.log'
    Write-Host ("Running: .\mvnw.cmd {0}" -f ($arguments -join ' ')) -ForegroundColor Cyan
    Push-Location $serverRoot
    # 原生命令往 stderr 写东西(例如 JVM 那句 sun.misc.Unsafe 警告)时,PowerShell 5.1 会把它当成
    # 终止错误、在编译中途掐断构建(子进程也会被带走)。Maven 的退出码才是唯一判据,所以这一段
    # 放宽 ErrorActionPreference,只在结束时看 $LASTEXITCODE。
    $strict = $ErrorActionPreference
    $ErrorActionPreference = 'Continue'
    try {
        # clean 只能单独先跑:日志文件就在 target\ 下、且被下面那条 `*>` 重定向一直打开着,
        # 把 clean 并进同一次 Maven 调用会以 "Failed to delete target\server-tests.log" 失败。
        if ($Clean) {
            Write-Host 'Running: .\mvnw.cmd -o clean' -ForegroundColor Cyan
            & (Join-Path $serverRoot 'mvnw.cmd') -o clean *> $null
            if ($LASTEXITCODE -ne 0) { throw "mvnw clean failed (exit $LASTEXITCODE)." }
            # clean 把整个 target\ 删掉,重定向就没地方写日志了(而且会静默变成"假成功")。
            New-Item -ItemType Directory -Force -Path (Split-Path $log) | Out-Null
        }
        # 先落一个空文件:万一这条重定向失败,$LASTEXITCODE 会留着上一次的值,下面据此判定"没跑成"。
        Set-Content -Path $log -Value ''
        Write-Host ("Running: .\mvnw.cmd {0}" -f ($arguments -join ' ')) -ForegroundColor Cyan
        & (Join-Path $serverRoot 'mvnw.cmd') @arguments *> $log
        $exitCode = $LASTEXITCODE
        if ((Get-Item $log).Length -eq 0) { throw "Maven wrote nothing to $log; the run did not start." }
    } finally {
        $ErrorActionPreference = $strict
        Pop-Location
    }