<# .SYNOPSIS 把测试用的 Pester 5 装进仓库内的 .tools\modules(不动机器上的全局模块)。 .DESCRIPTION tests\BakNRet.Tests.ps1 需要 Pester 5.0+。本机常见的坑是: * Windows 自带的是 Pester 3.4.0,没有 `Should -Be`,套件会语法错误; * 直接 Install-Module 会把 5.x 装到全局,可能影响机器上别的、按 3.x 语法写的脚本。 所以这里用 Save-Module 把指定版本下载到仓库内的 .tools\modules, tests\Run-Pester.ps1 会自动把该目录加进 PSModulePath。 .tools\ 已进 .gitignore,不会污染版本库。 .EXAMPLE pwsh -File .\tools\Install-TestDependencies.ps1 .EXAMPLE pwsh -File .\tools\Install-TestDependencies.ps1 -PesterVersion 5.9.1 -Force #> [CmdletBinding()] param( [version]$PesterVersion = [version]'5.9.1', [switch]$Force ) $ErrorActionPreference = 'Stop' $ProgressPreference = 'SilentlyContinue' $projectRoot = Split-Path -Parent $PSScriptRoot $target = Join-Path $projectRoot '.tools\modules' $installed = Join-Path $target ("Pester\{0}" -f $PesterVersion) Write-Host '' Write-Host ("目标目录 : {0}" -f $target) Write-Host ("Pester : {0}" -f $PesterVersion) Write-Host '' if ((Test-Path -LiteralPath $installed) -and -not $Force) { Write-Host "已经装好了,无需重复下载(要重装加 -Force)。" -ForegroundColor Green exit 0 } if ($Force -and (Test-Path -LiteralPath (Join-Path $target 'Pester'))) { Remove-Item -LiteralPath (Join-Path $target 'Pester') -Recurse -Force } New-Item -ItemType Directory -Path $target -Force | Out-Null if (-not (Get-Command Save-Module -ErrorAction SilentlyContinue)) { Write-Error '当前环境没有 Save-Module(需要 PowerShellGet 2.x)。请改用:Install-Module Pester -Scope CurrentUser -MinimumVersion 5.0.0' exit 1 } try { Save-Module -Name Pester -RequiredVersion $PesterVersion -Path $target -Force -ErrorAction Stop } catch { Write-Error "下载失败(多半是访问不到 PSGallery):$_" exit 1 } $module = Get-Module -ListAvailable Pester | Where-Object { [version]$_.Version -eq $PesterVersion } if (-not $module) { Write-Error "下载结束但找不到 Pester $PesterVersion,请检查 $target。" exit 1 } Write-Host ("已安装:Pester {0} -> {1}" -f $module.Version, $module.ModuleBase) -ForegroundColor Green Write-Host '现在可以跑:.\tests\Run-Pester.ps1' -ForegroundColor Cyan Write-Host '' exit 0