Server-Bibliothek
vor 18 Std. 98bce1b0da675715b2e5482c0ad61ba21135f62f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Baut EINE eigenstaendige Windows-.exe des Software-Bibliothek-Clients.
#
# Laeuft aus einem FRISCHEN Git-Klon ohne Vorbereitung: die virtuelle Umgebung wird
# angelegt, Python- und npm-Abhaengigkeiten werden installiert, die Oberflaeche
# gebaut und alles zu einer Datei gepackt. Damit ist dieses Skript der einzige
# Bau-Befehl, den die Software-Bibliothek braucht (siehe software-bibliothek.json).
$ErrorActionPreference = "Stop"
$desktop = $PSScriptRoot
$projekt = Split-Path $desktop -Parent
Set-Location $desktop
 
$python = "$desktop\.venv\Scripts\python.exe"
 
# 1. Virtuelle Umgebung sicherstellen. Ein frischer Klon hat keine; der Starter 'py'
#    ist auf Windows der zuverlaessigste Weg (nicht der Store-Stub).
if (-not (Test-Path $python)) {
  Write-Host "Virtuelle Umgebung fehlt - wird angelegt ..."
  $angelegt = $false
  foreach ($starter in @(@("py", @("-3")), @("python", @()), @("python3", @()))) {
    $befehl = $starter[0]
    if (-not (Get-Command $befehl -ErrorAction SilentlyContinue)) { continue }
    & $befehl @($starter[1] + @("-m", "venv", "$desktop\.venv"))
    if ($LASTEXITCODE -eq 0 -and (Test-Path $python)) { $angelegt = $true; break }
  }
  if (-not $angelegt) { throw "Keine Python-Installation gefunden (py / python / python3)." }
}
 
# 2. Python-Abhaengigkeiten
Write-Host "Python-Abhaengigkeiten ..."
& $python -m pip install --upgrade pip --quiet
& $python -m pip install -r "$desktop\requirements.txt" --quiet
& $python -m pip install pyinstaller --quiet
if ($LASTEXITCODE -ne 0) { throw "pip fehlgeschlagen." }
 
# 3. Oberflaeche bauen. Sie liegt als npm-Workspace im Projekt-Wurzelverzeichnis
#    und teilt sich die Typen mit dem Server - deshalb wird dort installiert.
Write-Host "Oberflaeche bauen ..."
Push-Location $projekt
npm install --no-audit --no-fund
if ($LASTEXITCODE -ne 0) { Pop-Location; throw "npm install fehlgeschlagen." }
npm run build:desktop-ui
if ($LASTEXITCODE -ne 0) { Pop-Location; throw "Bau der Oberflaeche fehlgeschlagen." }
Pop-Location
 
if (-not (Test-Path "$desktop\frontend\dist\index.html")) {
  throw "Die gebaute Oberflaeche fehlt unter frontend\dist."
}
 
# 4. Alte Bau-Artefakte weg, damit nichts von einem frueheren Lauf ueberlebt.
Remove-Item "$desktop\build", "$desktop\dist" -Recurse -Force -ErrorAction SilentlyContinue
 
# 5. Eine Datei daraus machen. Die Oberflaeche wird als Datenverzeichnis
#    mitgepackt; __main__.py findet sie zur Laufzeit unter sys._MEIPASS.
#
#    `--collect-all` ist bei den drei webview-Paketen Pflicht: pywebview zeigt das
#    Fenster unter Windows ueber WebView2, und das spricht es via pythonnet in .NET
#    an. Diese Bestandteile findet PyInstaller nicht durch Nachverfolgen der
#    Importe — ohne sie startet die exe und beendet sich sofort wieder.
Write-Host "PyInstaller ..."
& $python -m PyInstaller `
  --noconfirm `
  --onefile `
  --windowed `
  --name "Software-Bibliothek" `
  --icon "$desktop\assets\icon.ico" `
  --distpath "$desktop\dist" --workpath "$desktop\build" `
  --add-data "$desktop\frontend\dist;frontend/dist" `
  --collect-all webview `
  --collect-all pythonnet `
  --collect-all clr_loader `
  "$desktop\run_app.py"
if ($LASTEXITCODE -ne 0) { throw "PyInstaller fehlgeschlagen." }
 
$ergebnis = "$desktop\dist\Software-Bibliothek.exe"
if (-not (Test-Path $ergebnis)) { throw "Erwartete Datei fehlt: $ergebnis" }
Write-Host "Fertig: $ergebnis ($([math]::Round((Get-Item $ergebnis).Length / 1MB, 1)) MB)"