====== Pack-Struktur ======
Struktur und Regeln für WvdS Control/Component Packs - sowohl intern als auch von Drittanbietern.
===== Übersicht =====
Packs sind das Verteilungsformat für:
* **Controls** - UI-Elemente (Button, TextBox, DateEdit, ...)
* **Components** - Nicht-visuelle Komponenten (Timer, DataSource, ...)
Packs ermöglichen es, Controls zu installieren **ohne den WvdS-Core zu modifizieren**.
===== Verzeichnisstruktur =====
==== Interne WvdS Packs ====
**Pfad:** ''~/packs/''
~/packs/
├── controls/
│ ├── button/
│ │ └── pack.wvds.json
│ ├── textbox/
│ │ └── pack.wvds.json
│ └── dateedit/
│ └── pack.wvds.json
└── components/
├── timer/
│ └── pack.wvds.json
└── datasource/
└── pack.wvds.json
==== Drittanbieter Packs ====
**Pfad:** ''~/vendor-packs/''
~/vendor-packs/
├── index.json # Installations-Index
├── oss/ # Open-Source Packs
│ └── {vendor}/
│ └── {pack}/
│ ├── pack.wvds.json # Pack-Manifest (PFLICHT)
│ ├── src/ # Pascal-Units
│ │ ├── Model.pas
│ │ └── Renderers/
│ │ ├── TUI.pas
│ │ ├── Desktop.pas
│ │ └── Web.pas
│ ├── vsix/ # Design-Time Ressourcen
│ ├── docs/ # API-Dokumentation
│ └── license/ # OSS-Lizenz
│ └── LICENSE.txt
└── proprietary/ # Proprietäre Packs
└── {vendor}/
└── {pack}/
├── pack.wvds.json
├── src/ oder bin/ # Quellcode oder Binaries
├── vsix/
├── docs/
├── license/
│ ├── LICENSE.txt
│ └── EULA.txt
└── integrity/ # Integritätsprüfung
├── SHA256SUMS
└── SIGNATURE.asc # Optional
===== Pack-Manifest =====
Jedes Pack benötigt eine ''pack.wvds.json'' Datei:
{
"id": "dateedit",
"vendor": "wvds",
"version": "0.1.0",
"license": "MIT",
"description": "Datums-Eingabefeld mit Kalender-Popup",
"xml": {
"namespace": "wvds",
"tag": "DateEdit"
},
"model": {
"unit": "WvdS.UI.Controls.Editors.DateEdit",
"class": "TWvdSDateEdit"
},
"renderers": {
"tui": {
"unit": "WvdS.UI.TUI.Renderers.DateEdit",
"class": "TWvdSTUIDateEditRenderer"
},
"desktop": {
"unit": "WvdS.UI.Desktop.Renderers.DateEdit",
"class": "TWvdSDesktopDateEditRenderer"
},
"web": {
"unit": "WvdS.UI.Web.Renderers.DateEdit",
"class": "TWvdSWebDateEditRenderer"
}
},
"targetCaps": {
"requires": ["keyboard"],
"optional": ["mouse", "popup", "touch"]
},
"dependencies": [],
"compatibility": {
"wvds": ">=0.1.0"
}
}
==== Manifest-Felder ====
^ Feld ^ Pflicht ^ Beschreibung ^
| ''id'' | Ja | Eindeutiger Pack-Identifier |
| ''vendor'' | Ja | Vendor-ID (z.B. "wvds", "dx", "ms") |
| ''version'' | Ja | Semantic Version |
| ''license'' | Ja | Lizenz-Identifier (SPDX) |
| ''xml.namespace'' | Ja | PXAML-Namespace |
| ''xml.tag'' | Ja | PXAML-Tag-Name |
| ''model.unit'' | Ja | Pascal-Unit für Model |
| ''model.class'' | Ja | Klassenname des Models |
| ''renderers'' | Ja | Renderer pro Target |
| ''targetCaps'' | Nein | Erforderliche/optionale Capabilities |
| ''dependencies'' | Nein | Abhängigkeiten zu anderen Packs |
| ''compatibility'' | Nein | WvdS-Versionsanforderung |
===== Installations-Index =====
**Pfad:** ''~/vendor-packs/index.json''
{
"version": "1.0",
"installed": [
{
"vendor": "dx",
"pack": "dateedit-pro",
"version": "2.1.0",
"license": "proprietary",
"location": "proprietary/dx/dateedit-pro",
"enabledTargets": ["desktop", "web"],
"installedAt": "2026-01-13T10:30:00Z",
"integrity": {
"sha256": "abc123..."
}
},
{
"vendor": "jw",
"pack": "charts",
"version": "1.0.0",
"license": "oss",
"location": "oss/jw/charts",
"enabledTargets": ["desktop", "web"],
"installedAt": "2026-01-12T14:00:00Z"
}
]
}
===== CLI-Befehle =====
==== Pack installieren ====
wvds-build pack install \
--from /path/to/packdir \
--to ~/vendor-packs \
--enable tui,desktop,web
==== Pack deinstallieren ====
wvds-build pack uninstall \
--vendor dx \
--pack dateedit-pro
==== Installierte Packs auflisten ====
wvds-build pack list
Ausgabe:
Installed Packs:
dx/dateedit-pro 2.1.0 [desktop, web] proprietary
jw/charts 1.0.0 [desktop, web] oss
===== Namenskonventionen =====
Drittanbieter-Packs dürfen NICHT das ''TWvdS*'' Präfix verwenden!
^ Vendor ^ Klassen-Präfix ^ Beispiel ^
| WvdS (intern) | ''TWvdS*'' | ''TWvdSDateEdit'' |
| DevExpress | ''TDx*'' | ''TDxDateEdit'' |
| Microsoft | ''TMs*'' | ''TMsFluentButton'' |
| JWorks | ''TJw*'' | ''TJwChartView'' |
===== Integritätsprüfung =====
Proprietäre Packs müssen Integritätsprüfung unterstützen:
**SHA256SUMS:**
a1b2c3d4... src/Model.pas
e5f6g7h8... src/Renderers/Desktop.pas
i9j0k1l2... src/Renderers/Web.pas
**Optionale Signatur:**
# Signatur erstellen
gpg --armor --detach-sign SHA256SUMS
# Signatur prüfen
gpg --verify SHA256SUMS.asc SHA256SUMS
===== Wichtige Regeln =====
KEINE Änderungen an WvdS-Core während Installation:
✗ ~/sources/common/WvdS/** darf NICHT editiert werden
✗ Keine manuellen "uses" Änderungen in Core-Units
Pack-Isolation:
✓ Jedes Pack ist eigenständig
✓ Deinstallation entfernt alle Pack-Dateien
✓ Index.json wird atomar aktualisiert
Backward Compatibility:
✓ Pack-Manifest-Format ist versioniert
✓ Ältere Packs funktionieren mit neueren WvdS-Versionen
✓ Breaking Changes werden durch Manifest-Version signalisiert
===== Drittanbieter-Pack erstellen =====
==== Schritt 1: Skeleton erstellen ====
mkdir -p ~/vendor-packs/oss/myvendor/mycontrol/{src,docs,license}
==== Schritt 2: Manifest schreiben ====
cat > ~/vendor-packs/oss/myvendor/mycontrol/pack.wvds.json << 'EOF'
{
"id": "mycontrol",
"vendor": "myvendor",
"version": "1.0.0",
"license": "MIT",
"xml": {
"namespace": "mv",
"tag": "MyControl"
},
"model": {
"unit": "MyVendor.Controls.MyControl",
"class": "TMvMyControl"
},
"renderers": {
"web": {
"unit": "MyVendor.Web.Renderers.MyControl",
"class": "TMvWebMyControlRenderer"
}
}
}
EOF
==== Schritt 3: Pascal-Units erstellen ====
* Model-Unit in ''src/''
* Renderer-Units in ''src/Renderers/''
==== Schritt 4: Lizenz hinzufügen ====
cp LICENSE.txt ~/vendor-packs/oss/myvendor/mycontrol/license/
==== Schritt 5: Registrieren ====
wvds-build pack install \
--from ~/vendor-packs/oss/myvendor/mycontrol \
--enable web
===== Siehe auch =====
* [[.:control-entwicklung|Control-Entwicklung]]
* [[.:build-pipeline|Build-Pipeline]]
* [[.:architektur|Architektur-Übersicht]]