246 lines
9.1 KiB
PowerShell
246 lines
9.1 KiB
PowerShell
#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"
|