bd6827cb2f
Gesamte Windows-Distribution-Dokumentation (ZIP, Setup.exe, MSI) in BUILD.md zusammengeführt. docs/windows_distribution.md entfernt, da redundant. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
404 lines
9.7 KiB
Markdown
404 lines
9.7 KiB
Markdown
# DocuMentor Build-Anleitung
|
|
|
|
## Voraussetzungen
|
|
|
|
```bash
|
|
# Dependencies installieren (inkl. Pillow für Icon-Generierung und PyInstaller)
|
|
uv sync --all-groups
|
|
```
|
|
|
|
Für MSI-Installer zusätzlich:
|
|
- **WiX Toolset v6**: `dotnet tool install --global wix`
|
|
|
|
Für Setup.exe zusätzlich:
|
|
- **Inno Setup**: https://jrsoftware.org/isdl.php
|
|
|
|
## Schnellstart: ZIP-Distribution erstellen
|
|
|
|
```bash
|
|
# Automatischer Build (empfohlen)
|
|
uv run python build_windows.py
|
|
```
|
|
|
|
Dies erstellt automatisch:
|
|
1. **Icon** (falls nicht vorhanden): `resources/icon.ico`
|
|
2. **Versionsinformationen**: `version_info.txt`
|
|
3. **Executable**: `dist/DocuMentor/DocuMentor.exe` (mit Icon und Versionsinformationen)
|
|
4. **ZIP-Archiv**: `dist/DocuMentor-YYYYMMDD-Windows.zip`
|
|
|
|
### Manuelle Build-Schritte
|
|
|
|
```bash
|
|
# 1. Cleanup
|
|
rm -rf build/ dist/
|
|
|
|
# 2. PyInstaller ausführen
|
|
uv run pyinstaller --clean DocuMentor.spec
|
|
|
|
# 3. Testen
|
|
# Auf Windows: dist/DocuMentor/DocuMentor.exe
|
|
# Mit Wine: wine dist/DocuMentor/DocuMentor.exe
|
|
```
|
|
|
|
## MSI-Installer erstellen (WiX Toolset)
|
|
|
|
### Schritt 1: PyInstaller Build erstellen
|
|
|
|
```bash
|
|
uv run python build_windows.py
|
|
```
|
|
|
|
### Schritt 2: ProductFiles.wxs generieren
|
|
|
|
**WICHTIG**: WiX v6 hat das `heat` Tool entfernt. Stattdessen wird ein Python-Skript verwendet:
|
|
|
|
```bash
|
|
# Generiert automatisch ProductFiles.wxs mit allen Dateien aus dist/DocuMentor
|
|
uv run python generate_wix_files.py
|
|
```
|
|
|
|
### Schritt 3: MSI kompilieren
|
|
|
|
```bash
|
|
wix build DocuMentor.wxs ProductFiles.wxs -o DocuMentor.msi
|
|
```
|
|
|
|
### Schritt 4: MSI testen
|
|
|
|
```bash
|
|
# Installation (als Administrator)
|
|
msiexec /i DocuMentor.msi
|
|
|
|
# Silent Installation für Deployment
|
|
msiexec /i DocuMentor.msi /quiet /qn /norestart
|
|
|
|
# Deinstallation
|
|
msiexec /x DocuMentor.msi
|
|
```
|
|
|
|
### MSI-Vorteile
|
|
|
|
- Windows-Standard (`.msi` Format)
|
|
- Gruppen-Richtlinien-Deployment (GPO) für Enterprise
|
|
- Silent Installation (`msiexec /quiet`)
|
|
- Windows Installer Transaktionen und Rollback
|
|
- Patch-Unterstützung (.msp für Updates)
|
|
- Versionsupgrades automatisch verwaltet
|
|
|
|
### MSI-Build automatisieren
|
|
|
|
Alternativ zu den manuellen Schritten kann ein `build_msi.py` Skript verwendet werden:
|
|
|
|
```bash
|
|
uv run python build_msi.py
|
|
```
|
|
|
|
Dieses Skript führt `generate_wix_files.py` und `wix build` automatisch nacheinander aus.
|
|
|
|
## Setup.exe erstellen (Inno Setup)
|
|
|
|
1. **GUID generieren** für `installer.iss` (nur beim ersten Mal!):
|
|
```bash
|
|
uv run python generate_guid.py
|
|
```
|
|
|
|
Kopiere die generierte GUID und füge sie in `installer.iss` bei `AppId` ein (Zeile ~22).
|
|
|
|
**WICHTIG**: Die GUID nur EINMAL generieren! Bei Updates dieselbe GUID verwenden.
|
|
|
|
2. **Windows-Build erstellen**:
|
|
```bash
|
|
uv run python build_windows.py
|
|
```
|
|
|
|
3. **Installer kompilieren**:
|
|
```bash
|
|
iscc installer.iss
|
|
```
|
|
|
|
4. **Ergebnis**:
|
|
- `dist/installer/DocuMentor-Setup-0.1.0.exe` (mit Icon und Versionsinformationen)
|
|
|
|
## Konfiguration anpassen
|
|
|
|
### Icon anpassen
|
|
|
|
**Option 1: Standard-Icon generieren**
|
|
```bash
|
|
uv run python create_icon.py
|
|
```
|
|
|
|
**Option 2: Eigenes Icon aus PNG erstellen**
|
|
```bash
|
|
uv run python create_icon.py ihr-logo.png
|
|
```
|
|
|
|
**Option 3: Manuell ICO-Datei platzieren**
|
|
1. Icon erstellen oder downloaden (`.ico` Format mit mehreren Größen)
|
|
2. Als `resources/icon.ico` speichern
|
|
3. Beim nächsten Build wird es automatisch verwendet
|
|
|
|
Das Icon wird automatisch verwendet für:
|
|
- Windows-Executable (DocuMentor.exe)
|
|
- Inno Setup Installer
|
|
- Desktop-Verknüpfungen
|
|
|
|
**Anforderungen:**
|
|
- Multi-Size ICO (16x16 bis 256x256 Pixel)
|
|
- Das `create_icon.py` Skript erstellt alle Größen automatisch
|
|
|
|
### Versionsinformationen
|
|
|
|
Versionsinformationen werden automatisch aus `pyproject.toml` generiert:
|
|
|
|
```bash
|
|
uv run python create_version_info.py
|
|
```
|
|
|
|
**Version ändern:**
|
|
|
|
In `pyproject.toml`:
|
|
```toml
|
|
version = "0.2.0"
|
|
```
|
|
|
|
Auch aktualisieren in:
|
|
- `installer.iss` (Zeile 13: `#define MyAppVersion`)
|
|
|
|
Dann Versionsinformationen neu generieren:
|
|
```bash
|
|
uv run python create_version_info.py
|
|
```
|
|
|
|
**Was enthalten die Versionsinformationen:**
|
|
- Dateiversion und Produktversion
|
|
- Beschreibung und Copyright
|
|
- Anwendungsname
|
|
- Wird in Windows Explorer angezeigt (Rechtsklick → Eigenschaften → Details)
|
|
|
|
### Build-Größe reduzieren
|
|
|
|
In `DocuMentor.spec` Module ausschließen:
|
|
```python
|
|
excludes=[
|
|
'tkinter',
|
|
'matplotlib',
|
|
'test',
|
|
'unittest',
|
|
],
|
|
```
|
|
|
|
### One-File Build (alles in einer .exe)
|
|
|
|
In `DocuMentor.spec` ändern:
|
|
```python
|
|
exe = EXE(
|
|
pyz,
|
|
a.scripts,
|
|
a.binaries, # Uncomment
|
|
a.zipfiles, # Uncomment
|
|
a.datas, # Uncomment
|
|
[], # Comment out
|
|
exclude_binaries=False, # Ändern
|
|
# ...
|
|
name='DocuMentor',
|
|
onefile=True, # Hinzufügen
|
|
)
|
|
|
|
# COLLECT auskommentieren oder entfernen
|
|
```
|
|
|
|
**Achtung**: One-File ist langsamer beim Start (3-5 Sekunden).
|
|
|
|
## Testing
|
|
|
|
### Lokales Testing (Linux/WSL)
|
|
|
|
```bash
|
|
# Build erstellen
|
|
uv run python build_windows.py
|
|
|
|
# Mit Wine testen
|
|
wine dist/DocuMentor/DocuMentor.exe
|
|
```
|
|
|
|
### Testing auf Windows
|
|
|
|
1. ZIP-Datei auf Windows-System kopieren
|
|
2. Entpacken
|
|
3. `DocuMentor.exe` starten
|
|
4. Features testen:
|
|
- [ ] Programmstart
|
|
- [ ] Einstellungsdialog öffnet beim ersten Start
|
|
- [ ] Projekt öffnen/erstellen
|
|
- [ ] Tree-Navigation
|
|
- [ ] XSL/XML-Dateien hinzufügen
|
|
- [ ] PDF-Generierung (mit konfigurierten Tools)
|
|
- [ ] PDF-Vergleich
|
|
|
|
## Troubleshooting
|
|
|
|
### "Module not found" beim Start
|
|
|
|
**Lösung A** — Einfache Python-Module: Hidden imports in `DocuMentor.spec` ergänzen:
|
|
```python
|
|
hiddenimports=[
|
|
'missing_module',
|
|
]
|
|
```
|
|
|
|
**Lösung B** — Packages mit nativen Extensions (Rust/C, z.B. `connectorx`):
|
|
`hiddenimports` allein reicht nicht, da PyInstaller die `__init__.py` ins PYZ-Archiv packt, aber die `.pyd`-Extension separat im Dateisystem erwartet. Stattdessen `collect_all` verwenden:
|
|
```python
|
|
from PyInstaller.utils.hooks import collect_all
|
|
cx_datas, cx_binaries, cx_hiddenimports = collect_all('problematic_package')
|
|
|
|
a = Analysis(
|
|
# ...
|
|
binaries=cx_binaries,
|
|
datas=cx_datas,
|
|
hiddenimports=cx_hiddenimports,
|
|
)
|
|
```
|
|
|
|
### Antivirus blockiert die .exe
|
|
|
|
**Ursache**: Unsigned executables werden oft als verdächtig eingestuft.
|
|
|
|
**Lösungen**:
|
|
1. Code-Signing-Zertifikat kaufen und verwenden
|
|
2. Bei Microsoft SmartScreen einreichen
|
|
3. Exception in Antivirus eintragen (für Tests)
|
|
|
|
### Executable ist zu groß (>200 MB)
|
|
|
|
**Lösungen**:
|
|
1. UPX-Kompression ist bereits aktiv
|
|
2. Ungenutzte Module excluden (siehe oben)
|
|
3. Virtual Environment aufräumen: `uv sync --no-dev`
|
|
|
|
### UI-Dateien nicht gefunden
|
|
|
|
**Problem**: `.ui` Dateien werden nicht gefunden.
|
|
|
|
**Lösung**: In `DocuMentor.spec` prüfen:
|
|
```python
|
|
datas=ui_files, # Muss gesetzt sein
|
|
```
|
|
|
|
Im Code müssen Ressource-Pfade PyInstaller-kompatibel aufgelöst werden:
|
|
```python
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
if hasattr(sys, "_MEIPASS"):
|
|
res_path = Path(sys._MEIPASS) / "res" / "data.sql"
|
|
else:
|
|
res_path = Path(__file__).parents[3] / "src" / "res" / "data.sql"
|
|
```
|
|
|
|
## Automatisierung
|
|
|
|
### GitHub Actions (CI/CD)
|
|
|
|
```yaml
|
|
name: Build Windows Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
build:
|
|
runs-on: windows-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v1
|
|
|
|
- name: Build
|
|
run: uv run python build_windows.py
|
|
|
|
- name: Create Release
|
|
uses: softprops/action-gh-release@v1
|
|
with:
|
|
files: dist/*.zip
|
|
```
|
|
|
|
### Lokales Release-Skript
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# release.sh - Erstellt vollständiges Release
|
|
|
|
VERSION="0.1.0"
|
|
|
|
echo "Building DocuMentor v$VERSION..."
|
|
|
|
# 1. Build
|
|
uv run python build_windows.py
|
|
|
|
# 2. Installer (falls Inno Setup installiert)
|
|
if command -v iscc &> /dev/null; then
|
|
iscc installer.iss
|
|
echo "✓ Installer erstellt"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Release v$VERSION fertig!"
|
|
echo " • ZIP: dist/DocuMentor-*-Windows.zip"
|
|
echo " • Setup: dist/installer/DocuMentor-Setup-$VERSION.exe"
|
|
```
|
|
|
|
## Distributions-Formate im Vergleich
|
|
|
|
| | ZIP | Setup.exe (Inno Setup) | MSI (WiX) |
|
|
|---|---|---|---|
|
|
| **Portabel** | Ja | Nein | Nein |
|
|
| **Installation nötig** | Nein | Ja | Ja |
|
|
| **Deinstallation** | Nein | Ja | Ja |
|
|
| **Start-Menü** | Nein | Ja | Ja |
|
|
| **GPO-Deployment** | Nein | Nein | Ja |
|
|
| **Silent Install** | — | Ja | Ja |
|
|
| **Rollback** | — | Nein | Ja |
|
|
| **Patch-Support** | — | Nein | Ja (.msp) |
|
|
|
|
## Externe Abhängigkeiten
|
|
|
|
DocuMentor benötigt diese Tools (NICHT im Installer enthalten):
|
|
|
|
1. **Java Runtime Environment (JRE) 11+** — Für Saxon und Apache FOP (https://adoptium.net/)
|
|
2. **Apache FOP** — XSL-FO zu PDF Konvertierung (https://xmlgraphics.apache.org/fop/)
|
|
3. **Saxon XSLT Prozessor** — XSLT 2.0/3.0 Transformationen (https://www.saxonica.com/)
|
|
4. **diff-pdf** — PDF-Vergleich (https://vslavik.github.io/diff-pdf/)
|
|
|
|
Nach der Installation müssen die Pfade zu diesen Tools in den DocuMentor-Einstellungen konfiguriert werden.
|
|
|
|
## Dokumentation für Endbenutzer
|
|
|
|
Die `dist/DocuMentor/README.txt` wird automatisch erstellt und enthält:
|
|
- Installationsanweisungen
|
|
- Liste der externen Abhängigkeiten
|
|
- Konfigurationshinweise
|
|
|
|
## Versionierung
|
|
|
|
Version in folgenden Dateien aktualisieren:
|
|
1. `pyproject.toml` — `version = "X.Y.Z"`
|
|
2. `installer.iss` — `#define MyAppVersion "X.Y.Z"`
|
|
|
|
Dann Versionsinformationen neu generieren:
|
|
```bash
|
|
uv run python create_version_info.py
|
|
```
|
|
|
|
## Lizenz und Rechtliches
|
|
|
|
- PySide6 (LGPL): Dynamische Verlinkung ist OK
|
|
- Polars (MIT): Unproblematisch
|
|
- Pydantic (MIT): Unproblematisch
|
|
|
|
Externe Tools (Saxon, FOP) haben eigene Lizenzen und müssen separat installiert werden.
|