#requires -Version 5 param( [string]$AndroidHome = "C:\Android\Sdk", [switch]$InstallMissing, [switch]$SetEnvironment, [switch]$NoColor ) $ErrorActionPreference = "Stop" function Write-Info([string]$message) { if ($NoColor) { Write-Host $message; return } Write-Host $message -ForegroundColor Cyan } function Write-Ok([string]$message) { if ($NoColor) { Write-Host ("OK: " + $message); return } Write-Host ("OK: " + $message) -ForegroundColor Green } function Write-Warn([string]$message) { if ($NoColor) { Write-Host ("WARN: " + $message); return } Write-Host ("WARN: " + $message) -ForegroundColor Yellow } function Write-Err([string]$message) { if ($NoColor) { Write-Host ("ERR: " + $message); return } Write-Host ("ERR: " + $message) -ForegroundColor Red } function Fail([string]$message) { Write-Err $message exit 1 } function Command-Version([string]$name) { $cmd = Get-Command $name -ErrorAction SilentlyContinue if (-not $cmd) { return $null } try { $probe = & $cmd.Source --version 2>&1 if (-not $probe) { return "found (no version output)" } return ($probe | Select-Object -First 1) } catch { return "found" } } function Assert-Command { param( [string]$Name, [string]$InstallSuggestion, [bool]$Required = $true, [scriptblock]$ValueChecker, [scriptblock]$VersionCommand ) $command = Get-Command $Name -ErrorAction SilentlyContinue if (-not $command) { Write-Warn "${Name}: не найден" if ($InstallMissing) { if (Get-Command choco -ErrorAction SilentlyContinue) { Write-Info "-> Пробуем установить $Name через choco..." $expr = "choco install -y $InstallSuggestion" Write-Info $expr Invoke-Expression $expr } elseif (Get-Command winget -ErrorAction SilentlyContinue) { Write-Info "-> Пробуем установить $Name через winget..." $expr = "winget install --id $InstallSuggestion --source winget -h" Write-Info $expr Invoke-Expression $expr } else { Write-Err "Нет choco/winget, установите $Name вручную: $InstallSuggestion" if ($Required) { $global:failed = $true } return } } else { if ($Required) { $global:failed = $true } } return } if ($ValueChecker) { try { & $ValueChecker | Out-Null } catch { Write-Warn "${Name}: найден, но не прошел валидацию ($($_.Exception.Message))" if ($Required) { $global:failed = $true } return } } if ($VersionCommand) { try { $version = (& $VersionCommand | Out-String).Trim() if (-not $version) { $version = $command.Source } } catch { $version = $command.Source } } else { $version = (& $command.Source --version 2>&1 | Select-Object -First 1) if ([string]::IsNullOrWhiteSpace($version)) { $version = $command.Source } } Write-Ok "${Name}: $version" } function Check-Java([int]$minVersion = 17) { $java = Get-Command java -ErrorAction SilentlyContinue if (-not $java) { return } $tmpStdout = [IO.Path]::GetTempFileName() $tmpStderr = [IO.Path]::GetTempFileName() try { $javaProc = Start-Process -FilePath $java.Source -ArgumentList "-version" -NoNewWindow -PassThru -Wait ` -RedirectStandardOutput $tmpStdout -RedirectStandardError $tmpStderr $versionOutput = ((Get-Content -Raw $tmpStdout) + "`n" + (Get-Content -Raw $tmpStderr)).Trim() if ($javaProc.ExitCode -ne 0) { Write-Warn "java: ошибка запуска `"-version`" (exit code=$($javaProc.ExitCode))" $global:failed = $true return } } catch { Write-Warn "java: не удалось определить версию ($($_.Exception.Message))" $global:failed = $true return } finally { Remove-Item -ErrorAction SilentlyContinue $tmpStdout, $tmpStderr } if ([string]::IsNullOrWhiteSpace($versionOutput)) { Write-Warn "java: не удалось прочитать версию" $global:failed = $true return } $line = ($versionOutput -split "`r?`n" | Select-Object -First 1).Trim() if ($line -match "version\s+`"(\d+)\.") { $major = [int]$matches[1] if ($major -lt $minVersion) { Write-Warn "java: версия $major, нужен JDK $minVersion+" $global:failed = $true } else { Write-Ok "java: $line" } } else { Write-Ok "java: $line" } } $global:failed = $false Write-Info "=== RAP: аудит локальной рабочей станции сборки ===" Write-Info "Путь репозитория: $PSScriptRoot\..\.." # Базовые тулзы платформы Assert-Command -Name "git" -InstallSuggestion "git" -Required $true Assert-Command -Name "go" -InstallSuggestion "golang" -Required $true -VersionCommand { (& go version | Select-Object -First 1) } Assert-Command -Name "node" -InstallSuggestion "nodejs-lts" -Required $false Assert-Command -Name "npm" -InstallSuggestion "nodejs-lts" -Required $false Assert-Command -Name "docker" -InstallSuggestion "docker-desktop" -Required $true Check-Java -minVersion 17 Assert-Command -Name "gradle" -InstallSuggestion "gradle" -Required $true -VersionCommand { "gradle из PATH" } # Android SDK Write-Info "Android SDK: $AndroidHome" if (-not (Test-Path $AndroidHome)) { if (-not $InstallMissing) { Write-Warn "Android SDK не найден: $AndroidHome" $global:failed = $true } else { Write-Err "Не могу автоматически установить Android SDK: $AndroidHome не существует." Write-Info "Установи Android Studio или Android SDK вручную, затем повтори." $global:failed = $true } } else { $sdkManagerPath = Join-Path $AndroidHome "cmdline-tools\latest\bin\sdkmanager.bat" $platformTools = Join-Path $AndroidHome "platform-tools" if (-not (Test-Path $sdkManagerPath)) { Write-Warn "Android cmdline-tools: не найден $sdkManagerPath" } else { Write-Ok "Android cmdline-tools: найден" } if (-not (Test-Path $platformTools)) { Write-Warn "platform-tools: не найден" } else { Write-Ok "platform-tools: найден" } $buildTools = Join-Path $AndroidHome "build-tools\35.0.1" if (-not (Test-Path $buildTools)) { Write-Warn "build-tools 35.0.1: отсутствует (рекомендуется установить)" if ($InstallMissing -and (Test-Path $sdkManagerPath)) { & $sdkManagerPath --sdk_root=$AndroidHome "build-tools;35.0.1" "platforms;android-35" "platform-tools" } } else { Write-Ok "build-tools 35.0.1: найден" } if (-not (Test-Path (Join-Path $AndroidHome "platforms\android-35"))) { Write-Warn "platforms;android-35: отсутствует (рекомендуется установить)" if ($InstallMissing -and (Test-Path $sdkManagerPath)) { & $sdkManagerPath --sdk_root=$AndroidHome "platforms;android-35" } } else { Write-Ok "platforms;android-35: найден" } } # Критичные для Android клиента бинарные утилиты Assert-Command -Name "adb" -InstallSuggestion "platform-tools" -Required $false # Дополнительные для сборки web/смоук-тестов Assert-Command -Name "python" -InstallSuggestion "python" -Required $false Assert-Command -Name "dotnet" -InstallSuggestion "dotnet-sdk" -Required $false if ($SetEnvironment) { [Environment]::SetEnvironmentVariable("ANDROID_HOME", $AndroidHome, "User") [Environment]::SetEnvironmentVariable("ANDROID_SDK_ROOT", $AndroidHome, "User") [Environment]::SetEnvironmentVariable("JAVA_HOME", $(Split-Path (Split-Path (Get-Command java).Source)), "User") Write-Ok "Переменные ANDROID_HOME / ANDROID_SDK_ROOT сохранены для текущего пользователя." } if ($global:failed) { Write-Warn "Найдены недостающие/некорректные зависимости." Write-Info "Запусти скрипт с -InstallMissing для попытки автоматической установки." exit 1 } Write-Host "" Write-Ok "Локальная среда сборки готова." Write-Info "Рекомендуемый следующий шаг:" Write-Info " pwsh -ExecutionPolicy Bypass -File scripts\android\prepare-android-build-environment.ps1 -SetEnvironment" Write-Info " pwsh -ExecutionPolicy Bypass -File scripts\android\build-android-apk.ps1 -NoPrepare -BuildType debug -SkipWorkspaceCleanup"