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>
This commit is contained in:
@@ -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
@@ -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"
|
||||
|
||||
@@ -253,5 +253,5 @@ HINWEISE
|
||||
|
||||
================================================================================
|
||||
Stand: April 2026
|
||||
Erstellt für: DocuMentor v1.6.5
|
||||
Erstellt für: DocuMentor v1.6.6
|
||||
================================================================================
|
||||
|
||||
+1
-1
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user