diff --git a/docs/CODEMAP.md b/docs/CODEMAP.md index 3119ac2..3286918 100644 --- a/docs/CODEMAP.md +++ b/docs/CODEMAP.md @@ -59,10 +59,17 @@ RUSTC_BOOTSTRAP=1 нужен, т.к. cargo-expand требует nightly-фич, `generated_bridge.dart`/`.freezed.dart` нет → flutter build падает `EventToUI_Event/RustdeskImpl isn't a type`. Поэтому проверять надо dart-файлы, не только rust. -### Открытый вопрос (решить при первой сборке) -Апстрим для Windows-x64 подменяет flutter-engine кастомным `windows-x64-release.zip` (ради Win7). -Для таргета Win10/11, вероятно, можно оставить стоковый engine 3.24.5 и пропустить подмену — проверить, -не падает ли `flutter build windows` без неё. +### Грабля: portable-pack и python3-заглушка (GUSIK-PC) +`build.py --flutter` в конце зовёт `python3 ./generate.py` для сборки портативного установщика. На +GUSIK-PC `python3` = Microsoft Store-заглушка (реальный только `python` = 3.12) → шаг падает +(«Python Error occurred when executing generate.py»), хотя **клиент к этому моменту уже собран** в +`flutter/build/windows/x64/runner/Release/`. Поэтому `build-windows.ps1` зовёт `build.py --skip-portable-pack`, +а установщик пакует отдельным шагом реальным `python generate.py` → `target/release/rustdesk-portable-packer.exe` +→ копия в `dist/rustdesk--install.exe`. + +### Разрешённый вопрос: flutter-engine +Стоковый Flutter 3.24.5 x64 engine отработал — `flutter build windows` собрался БЕЗ кастомного +`windows-x64-release.zip` (тот нужен апстриму только для Win7). Для Win10/11 подмена не требуется. ## Android toolchain (VM 118, позже) Flutter 3.24.5, NDK r28c, cargo-ndk 3.1.2, Rust android-таргеты, vcpkg android-триплеты diff --git a/scripts/build-windows.ps1 b/scripts/build-windows.ps1 index e23160f..f7d1626 100644 --- a/scripts/build-windows.ps1 +++ b/scripts/build-windows.ps1 @@ -127,18 +127,30 @@ Push-Location $src if ($LASTEXITCODE) { Pop-Location; throw "vcpkg install упал ($LASTEXITCODE)" } Pop-Location -# --- сборка --- -Write-Host "python build.py --flutter..." -ForegroundColor Cyan +# --- сборка клиента (без портативной упаковки: её build.py делает через `python3`, +# а на GUSIK-PC python3 = Store-заглушка -> падает; пакуем отдельно реальным python) --- +Write-Host "python build.py --flutter --skip-portable-pack..." -ForegroundColor Cyan Push-Location $src -python build.py --flutter +python build.py --flutter --skip-portable-pack $rc = $LASTEXITCODE Pop-Location if ($rc) { throw "build.py упал ($rc)" } +$rel = 'flutter/build/windows/x64/runner/Release' +if (-not (Test-Path "$src/$rel/rustdesk.exe")) { throw "клиент не собран: нет $rel/rustdesk.exe" } -# --- артефакт --- +# --- портативный установщик (generate.py реальным python) --- +Write-Host "Упаковка портативного установщика (generate.py)..." -ForegroundColor Cyan +Push-Location "$src\libs\portable" +python -m pip install -q -r requirements.txt +python generate.py -f "../../$rel/" -o . -e "../../$rel/rustdesk.exe" +$genRc = $LASTEXITCODE +Pop-Location +if ($genRc) { throw "generate.py упал ($genRc)" } + +# --- артефакт в dist --- New-Item -ItemType Directory -Force $dist | Out-Null -$out = Get-ChildItem -Path $src -Filter 'rustdesk-*-install.exe' -EA SilentlyContinue | Select-Object -First 1 -if (-not $out) { $out = Get-ChildItem -Path $src -Recurse -Filter 'rustdesk*.exe' -EA SilentlyContinue | - Where-Object { $_.FullName -match 'Release' } | Select-Object -First 1 } -if ($out) { Copy-Item $out.FullName (Join-Path $dist $out.Name) -Force; Write-Host "ГОТОВО: $(Join-Path $dist $out.Name)" -ForegroundColor Green } -else { Write-Host "Сборка ок, но .exe не найден — глянь $src (rustdesk-*-install.exe) и $src\flutter\build." -ForegroundColor Yellow } +$packer = "$src\target\release\rustdesk-portable-packer.exe" +if (-not (Test-Path $packer)) { throw "не найден rustdesk-portable-packer.exe после generate.py" } +$outExe = Join-Path $dist "rustdesk-$TAG-install.exe" +Copy-Item $packer $outExe -Force +Write-Host "ГОТОВО: $outExe ($([math]::Round((Get-Item $outExe).Length/1MB,1)) MB)" -ForegroundColor Green