|
| 1 | +Set-StrictMode -Version Latest |
| 2 | +$ErrorActionPreference = 'Stop' |
| 3 | + |
| 4 | +<# |
| 5 | +.SYNOPSIS |
| 6 | + 检测缺失的 PostgreSQL CLI 工具。 |
| 7 | +
|
| 8 | +.DESCRIPTION |
| 9 | + 默认检查 `psql`、`pg_dump`、`pg_restore`、`pg_dumpall`, |
| 10 | + 为 `install-tools` 决定是否需要输出或执行安装计划。 |
| 11 | +
|
| 12 | +.PARAMETER Tools |
| 13 | + 要检查的工具名称列表。 |
| 14 | +
|
| 15 | +.OUTPUTS |
| 16 | + string[] |
| 17 | + 返回当前环境中缺失的工具名数组。 |
| 18 | +#> |
| 19 | +function Get-MissingPgTools { |
| 20 | + [CmdletBinding()] |
| 21 | + param( |
| 22 | + [string[]]$Tools = @('psql', 'pg_dump', 'pg_restore', 'pg_dumpall') |
| 23 | + ) |
| 24 | + |
| 25 | + return @( |
| 26 | + foreach ($tool in $Tools) { |
| 27 | + if (-not (Get-Command $tool -ErrorAction SilentlyContinue)) { |
| 28 | + $tool |
| 29 | + } |
| 30 | + } |
| 31 | + ) |
| 32 | +} |
| 33 | + |
| 34 | +<# |
| 35 | +.SYNOPSIS |
| 36 | + 生成 PostgreSQL CLI 安装计划。 |
| 37 | +
|
| 38 | +.DESCRIPTION |
| 39 | + 根据平台与包管理器策略选择对应的安装命令列表。 |
| 40 | +
|
| 41 | +.PARAMETER Platform |
| 42 | + 目标平台,只支持 `windows`、`macos`、`linux`。 |
| 43 | +
|
| 44 | +.PARAMETER PackageManager |
| 45 | + 指定包管理器名称;`auto` 会自动选择默认策略。 |
| 46 | +
|
| 47 | +.PARAMETER Tools |
| 48 | + 需要安装或检测的 PostgreSQL CLI 工具名列表。 |
| 49 | +
|
| 50 | +.OUTPUTS |
| 51 | + PSCustomObject |
| 52 | + 返回包管理器名称和待执行命令列表。 |
| 53 | +#> |
| 54 | +function Get-PgInstallPlan { |
| 55 | + [CmdletBinding()] |
| 56 | + param( |
| 57 | + [Parameter(Mandatory)] |
| 58 | + [ValidateSet('windows', 'macos', 'linux')] |
| 59 | + [string]$Platform, |
| 60 | + |
| 61 | + [string]$PackageManager = 'auto', |
| 62 | + |
| 63 | + [string[]]$Tools = @('psql', 'pg_dump', 'pg_restore', 'pg_dumpall') |
| 64 | + ) |
| 65 | + |
| 66 | + switch ($Platform) { |
| 67 | + 'windows' { return (Get-PgWindowsInstallPlan -PackageManager $PackageManager) } |
| 68 | + 'macos' { return (Get-PgMacOSInstallPlan -PackageManager $PackageManager) } |
| 69 | + 'linux' { return (Get-PgLinuxInstallPlan -PackageManager $PackageManager) } |
| 70 | + } |
| 71 | +} |
| 72 | + |
| 73 | +<# |
| 74 | +.SYNOPSIS |
| 75 | + 输出或执行 PostgreSQL CLI 安装计划。 |
| 76 | +
|
| 77 | +.DESCRIPTION |
| 78 | + 默认仅返回安装命令文本;传入 `-Apply` 时按平台选择 shell 执行命令。 |
| 79 | +
|
| 80 | +.PARAMETER Plan |
| 81 | + 由 `Get-PgInstallPlan` 返回的安装计划对象。 |
| 82 | +
|
| 83 | +.PARAMETER Apply |
| 84 | + 是否执行安装命令。 |
| 85 | +
|
| 86 | +.OUTPUTS |
| 87 | + PSCustomObject |
| 88 | + 返回包含 `ExitCode` 与 `Output` 的标准结果对象。 |
| 89 | +#> |
| 90 | +function Invoke-PgInstallPlan { |
| 91 | + [CmdletBinding()] |
| 92 | + param( |
| 93 | + [Parameter(Mandatory)] |
| 94 | + [pscustomobject]$Plan, |
| 95 | + |
| 96 | + [switch]$Apply |
| 97 | + ) |
| 98 | + |
| 99 | + if (-not $Apply) { |
| 100 | + return [PSCustomObject]@{ |
| 101 | + ExitCode = 0 |
| 102 | + Output = ($Plan.Commands -join [Environment]::NewLine) |
| 103 | + } |
| 104 | + } |
| 105 | + |
| 106 | + $runner = if ($IsWindows) { |
| 107 | + @{ |
| 108 | + FilePath = 'pwsh' |
| 109 | + ArgumentList = @('-NoProfile', '-Command') |
| 110 | + } |
| 111 | + } |
| 112 | + else { |
| 113 | + @{ |
| 114 | + FilePath = '/bin/sh' |
| 115 | + ArgumentList = @('-lc') |
| 116 | + } |
| 117 | + } |
| 118 | + |
| 119 | + foreach ($commandText in $Plan.Commands) { |
| 120 | + Write-PostgresToolkitMessage -Level info -Message ("执行安装命令: {0}" -f $commandText) |
| 121 | + $null = & $runner.FilePath @($runner.ArgumentList + $commandText) |
| 122 | + if ($LASTEXITCODE -ne 0) { |
| 123 | + throw "安装命令执行失败: $commandText" |
| 124 | + } |
| 125 | + } |
| 126 | + |
| 127 | + return [PSCustomObject]@{ |
| 128 | + ExitCode = 0 |
| 129 | + Output = ($Plan.Commands -join [Environment]::NewLine) |
| 130 | + } |
| 131 | +} |
0 commit comments