2 Commits

Author SHA1 Message Date
info bf2db92040 Version 1.6.6: Versionsanzeige im Info-Dialog bei PyInstaller-Bundle gefixt
Im PyInstaller-Bundle fehlten .dist-info-Metadaten, wodurch importlib.metadata
keine Paketversionen liefern konnte. Lösung: DocuMentor.spec erzeugt beim Build
einen Versions-Snapshot (versions.json) der ins Bundle eingebettet wird.
license_parser.py liest diesen Snapshot im Bundle-Modus statt importlib.metadata.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 13:54:27 +02:00
info 19f7deec20 build_msi.py: Klare Fehlermeldung bei fehlendem wix-Befehl
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 13:34:30 +02:00
8 changed files with 62 additions and 10 deletions
+20
View File
@@ -4,7 +4,10 @@ PyInstaller Konfiguration für DocuMentor
Erstellt eine eigenständige Windows-Executable ohne Python-Installation
"""
import json
import sys
from importlib.metadata import PackageNotFoundError
from importlib.metadata import version as pkg_version
from pathlib import Path
from PyInstaller.utils.hooks import collect_all
@@ -14,6 +17,22 @@ block_cipher = None
project_root = Path(SPECPATH)
src_path = project_root / 'src'
# Versions-Snapshot erzeugen und ins Bundle einbetten
_packages_to_snapshot = [
"PySide6", "pydantic", "pydantic-settings", "pydantic-yaml",
"polars", "connectorx", "pyarrow", "psutil", "lxml",
"ruff", "pyinstaller", "pillow",
]
_versions_snapshot: dict[str, str] = {}
for _pkg in _packages_to_snapshot:
try:
_versions_snapshot[_pkg.lower()] = pkg_version(_pkg)
except PackageNotFoundError:
_versions_snapshot[_pkg.lower()] = ""
_versions_file = project_root / "versions.json"
_versions_file.write_text(json.dumps(_versions_snapshot), encoding="utf-8")
# connectorx komplett sammeln (Python-Code, native .pyd und Metadaten)
# PyInstaller erkennt connectorx nicht automatisch, da es zur Laufzeit
# von polars per importlib.import_module() geladen wird
@@ -36,6 +55,7 @@ a = Analysis(
datas=ui_files + res_files + cx_datas + [
(str(project_root / 'pyproject.toml'), '.'),
(str(project_root / 'THIRD_PARTY_LICENSES.txt'), '.'),
(str(_versions_file), '.'),
(str(project_root / 'resources' / 'icon.ico'), 'resources'),
],
hiddenimports=[
+1 -1
View File
@@ -4,7 +4,7 @@
<!-- Paket-Definition (ersetzt Product in v4) -->
<Package
Name="DocuMentor"
Version="1.6.5"
Version="1.6.6"
Manufacturer="Vitali Graf / Software- und Datenbankentwicklung"
UpgradeCode="F498B66C-726D-44AA-95F4-CB4FBDCEF26E"
Language="1031"
+1 -1
View File
@@ -253,5 +253,5 @@ HINWEISE
================================================================================
Stand: April 2026
Erstellt für: DocuMentor v1.6.5
Erstellt für: DocuMentor v1.6.6
================================================================================
+9
View File
@@ -48,10 +48,19 @@ def build_msi():
# Schritt 2: MSI kompilieren mit WiX v6
print("Schritt 2/2: Kompiliere MSI-Installer...")
try:
result = subprocess.run(
["wix", "build", "DocuMentor.wxs", "ProductFiles.wxs", "-o", str(msi_output)],
check=False,
)
except FileNotFoundError:
print("\nFEHLER: 'wix' wurde nicht gefunden!")
print("WiX v6 muss installiert sein. Installationsschritte:")
print(" 1. .NET SDK installieren: https://dot.net")
print(" 2. WiX als dotnet tool installieren:")
print(" dotnet tool install --global wix --version 6.*")
print(" 3. Neues Terminal öffnen (PATH aktualisieren)")
sys.exit(1)
if result.returncode != 0:
print("\nFEHLER: MSI-Kompilierung fehlgeschlagen!")
+1 -1
View File
@@ -10,7 +10,7 @@
; Build-Befehl: iscc installer.iss
#define MyAppName "DocuMentor"
#define MyAppVersion "1.6.5"
#define MyAppVersion "1.6.6"
#define MyAppPublisher "Ihr Name/Organisation"
#define MyAppURL "https://github.com/yourusername/xsl-validator"
#define MyAppExeName "DocuMentor.exe"
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "DocuMentor"
version = "1.6.5"
version = "1.6.6"
description = "Professionelle XSL-Transformations-Verwaltung und PDF-Generierung"
readme = "README.md"
license = {text = "MIT"}
+24 -1
View File
@@ -2,8 +2,10 @@
Parser für THIRD_PARTY_LICENSES.txt.
Extrahiert strukturierte Lizenzinformationen und ergänzt sie
mit den tatsächlich installierten Paketversionen via importlib.metadata.
mit den tatsächlich installierten Paketversionen via importlib.metadata
oder (im PyInstaller-Bundle) aus der mitgebündelten versions.json.
"""
import json
import logging
import re
import sys
@@ -71,8 +73,29 @@ def _normalize_package_name(display_name: str) -> str:
return display_name.lower().split("(")[0].strip()
_bundled_versions: dict[str, str] | None = None
def _load_bundled_versions() -> dict[str, str]:
"""Lädt den Versions-Snapshot aus der mitgebündelten versions.json (nur im PyInstaller-Bundle)."""
global _bundled_versions
if _bundled_versions is None:
if hasattr(sys, "_MEIPASS"):
versions_file = Path(sys._MEIPASS) / "versions.json" # type: ignore[attr-defined]
if versions_file.exists():
_bundled_versions = json.loads(versions_file.read_text(encoding="utf-8"))
else:
_bundled_versions = {}
else:
_bundled_versions = {}
return _bundled_versions
def _get_installed_version(package_name: str) -> str:
"""Ermittelt die installierte Version eines Pakets."""
bundled = _load_bundled_versions()
if bundled:
return bundled.get(package_name.lower(), "")
try:
return version(package_name)
except PackageNotFoundError:
Generated
+1 -1
View File
@@ -39,7 +39,7 @@ wheels = [
[[package]]
name = "documentor"
version = "1.6.5"
version = "1.6.6"
source = { virtual = "." }
dependencies = [
{ name = "connectorx" },