diff --git a/.gitignore b/.gitignore index ff7f203..2a1de3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ __pycache__/ *.pyc *.log +build/ +dist/ diff --git a/AGENTS.md b/AGENTS.md index 860210c..fed699d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -100,6 +100,33 @@ liegt in PATH zuerst eine Hermes-Agent-venv (`...\hermes\hermes-agent\venv\ Scripts\pythonw.exe`) ohne pyserial. `pyw`/`py` (Python Launcher) lösen zuverlässig zur echten Python313-Installation auf. +## Gepackte .exe (PyInstaller) — kein Terminal-Flash, kein Python-Setup nötig + +`build_and_deploy.ps1` baut `desktop_viewer.py` mit PyInstaller +(`--windowed --onedir`) und kopiert das Ergebnis lokal nach +`%LOCALAPPDATA%\VersaPadViewer\VersaPadViewer.exe`. Desktop-Verknüpfung +"VersaPad Viewer (Fenster)" zeigt dorthin. + +**`--onedir`, nicht `--onefile`** — Single-File-PyInstaller-Bundles lösen +öfter AV-Fehlalarme aus (sehen strukturell wie ein Packer aus); `--onedir` +(Ordner mit `.exe` + `_internal`) ist unauffälliger. Trotzdem unsigniert, +also grundsätzlich nie über Smart App Control/AV in Stein gemeißelt sicher. + +**Kritischer Stolperstein:** Die gebaute `.exe` läuft NICHT vom Netzlaufwerk +aus (`Z:\Git\...`, SMB-Share auf cj-ki) — Windows blockiert das Nachladen +der `_internal`-DLLs von einem Netzwerkpfad, der Prozess startet dann +einfach nie, ganz ohne Fehlermeldung/Crash-Log/AV-Benachrichtigung (sah +zuerst wie ein AV-Block aus, war aber keiner — sauber verifiziert indem +dieselbe `.exe` 1:1 lokal kopiert sofort lief). Bauen darf auf Z: passieren, +das fertige Bundle muss vor dem Start nach C: kopiert werden — genau das +macht `build_and_deploy.ps1`. + +Bei erneutem Bauen: `.\build_and_deploy.ps1` in PowerShell ausführen +(lokal, nicht über die sandboxed Bash-Tool-Umgebung — die hat eine eigene +Dateisystem-Sicht, die nicht zuverlässig mit dem echten Windows-Dateisystem +übereinstimmt; Kopieroperationen für Dinge, die der User/andere Prozesse +sehen sollen, gehören in PowerShell, nicht in Bash). + ## Dateien/Pfade (hardcoded, hal9001-spezifisch) - Einzel-JSONs (Read-only-Modus): `~\OneDrive\Desktop\versapad_config{1,2,3}.json` diff --git a/VersaPadViewer.spec b/VersaPadViewer.spec new file mode 100644 index 0000000..fc2858d --- /dev/null +++ b/VersaPadViewer.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['desktop_viewer.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='VersaPadViewer', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='VersaPadViewer', +) diff --git a/build_and_deploy.ps1 b/build_and_deploy.ps1 new file mode 100644 index 0000000..23318b4 --- /dev/null +++ b/build_and_deploy.ps1 @@ -0,0 +1,26 @@ +# Baut VersaPadViewer.exe (PyInstaller --onedir) und kopiert das Ergebnis +# nach lokal (C:\Users\\AppData\Local\VersaPadViewer). +# +# WICHTIG: Muss lokal laufen, NICHT direkt vom Netzlaufwerk (Z:\Git\...) -- +# Windows blockiert das Nachladen der PyInstaller-_internal-DLLs von einem +# Netzwerkpfad (SMB-Share) ohne jede Fehlermeldung, der Prozess startet +# einfach nie. Deshalb bauen wir hier (Quelle darf auf Z: liegen) und +# kopieren das fertige Bundle danach nach C:. + +$ErrorActionPreference = "Stop" +$projectDir = $PSScriptRoot +$localDir = "$env:LOCALAPPDATA\VersaPadViewer" + +Push-Location $projectDir +try { + py -m PyInstaller --windowed --onedir --name VersaPadViewer desktop_viewer.py --noconfirm +} finally { + Pop-Location +} + +if (Test-Path $localDir) { + Remove-Item $localDir -Recurse -Force +} +Copy-Item "$projectDir\dist\VersaPadViewer" -Destination $localDir -Recurse + +Write-Host "Fertig: $localDir\VersaPadViewer.exe"