Strategie und Struktur für Packages/Komponenten
-
- Beiträge: 1197
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Strategie und Struktur für Packages/Komponenten
Hi,
eine Frage nach eurer Erfahrung.
Nachdem ich mein erstes Package zusammengebaut habe kommt auch die Idee für weitere (zb Interne).
Wie strukturiert ihr das Verzeichnis eines Package? Gibt es da eine Best Practise?
Manche haben den Source gleich auf dem ersten verzeichnislevel, andere in einem eigenen Source-Verzeichnis. Dann kommen noch Demos dazu, evtl Ressourcen und zumindestens ein Verzeichnis in dem man eine Applikation für die Basisentwicklung hat. Wie sind da eure Erfahrungen dazu.
Das Verzeichnis für die Entwicklung mit ins Package oder nicht?
Wie strukturiert ihr das wenn man möglichst wenig Aufwand mit dem zusammenpacken für OPM, GIT etc haben will?
So wie es aussieht macht das jeder anders -- meine Frage geht in Richtung Erfahrungen und Strategien die gut laufen.
eine Frage nach eurer Erfahrung.
Nachdem ich mein erstes Package zusammengebaut habe kommt auch die Idee für weitere (zb Interne).
Wie strukturiert ihr das Verzeichnis eines Package? Gibt es da eine Best Practise?
Manche haben den Source gleich auf dem ersten verzeichnislevel, andere in einem eigenen Source-Verzeichnis. Dann kommen noch Demos dazu, evtl Ressourcen und zumindestens ein Verzeichnis in dem man eine Applikation für die Basisentwicklung hat. Wie sind da eure Erfahrungen dazu.
Das Verzeichnis für die Entwicklung mit ins Package oder nicht?
Wie strukturiert ihr das wenn man möglichst wenig Aufwand mit dem zusammenpacken für OPM, GIT etc haben will?
So wie es aussieht macht das jeder anders -- meine Frage geht in Richtung Erfahrungen und Strategien die gut laufen.
- af0815
- Lazarusforum e. V.
- Beiträge: 6977
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Strategie und Struktur für Packages/Komponenten
Schau mal ins Verzeichnis von Components von Lazarus (oder in OPM), da hast ein paar Beispiele.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 1197
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: Strategie und Struktur für Packages/Komponenten
hab ich als erstes gemacht -- es gibt eine klare Linie zu erkennen -- Jeder macht es wie er mag 

Re: Strategie und Struktur für Packages/Komponenten
Bei kleinen Packages kann man meinetwegen alles im Package-Rootverzeichnis belassen. Sobald aber mehr als ein paar Dateien beteiligt sind, würde ich das alles sauber strukturieren: source, include, resource, images, languages, examples, help/doc, tests (oder alles was mit dem Kompilieren des Packages zusammenhängt nach source: source, source/include, source/resource, alle Zusatzdateien dagegen in Ordner neben source). In source Unterverzeichnisse für runtime und designtime. Die Trennung in Runtime- und Designtime-Packages ist sinnvoll, um zu verhindern, dass der nur von der IDE-verwendete Code (darunter auch die Paletten-Icons) im User-Projekt landet. Aber: Das Designtime ruft das Runtime-Package nur in seinen Anforderungen auf, keinesfalls darf es den Pfad zu den Quellen des Runtime-Packages kennen, um Compilier-Probleme zu verhindern. Auch müssen die Ausgabeverzeichnisse von Runtime und Designtime-Package getrennt sein. Die Package-Dateien (*.lpk) packe ich am liebsten ins Rootverzeichnis, so dass sie beim Öffnen des Package sofort gefundenen werden, oder in einen Packages-Unterordner (vor allem wenn man auch Delphi mit eigenen Packages unterstützt).
Strenggenommen muss ein Package nur die für das Übersetzen benötigten Dateien enthalten. Aber man tut dem User mit so einer Minimalausstattung keinen Gefallen. Es sollte zumindest ein Beispielprojekt beigefügt sein, an dem an sieht, was das Package macht und wie man es anwendet.
Strenggenommen muss ein Package nur die für das Übersetzen benötigten Dateien enthalten. Aber man tut dem User mit so einer Minimalausstattung keinen Gefallen. Es sollte zumindest ein Beispielprojekt beigefügt sein, an dem an sieht, was das Package macht und wie man es anwendet.
-
- Beiträge: 7063
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Strategie und Struktur für Packages/Komponenten
Für SDL3 habe ich es so gemacht. Der Package Ordner sauber halten, die Beispiele ausserhalb des Package Ordners.Wie strukturiert ihr das Verzeichnis eines Package? Gibt es da eine Best Practise?
Dann habe ich noch einen sandbox Ordner für Tests, der kann der Anwender getrost ignorieren.
Wen ich noch Hilfstools für die Package habe, die kommen auch in eine Extra-Ordner.
https://github.com/sechshelme/Lazarus-S ... d-Examples
Da habe ich auch noch ein Beispiel einer grösseren Sammlung von Packages.
Dies ist (noch) nicht so toll. Das muss ich bei Gelegenheit noch ein wenig umordnen.
https://github.com/sechshelme/Lazarus-G ... d_Examples
So nebenbei wen ich für die LCL eine Package machen würde, dann würde ich sowieso voraussetzen, das man die Komponenten dynamisch lädt. Ich bin da nicht so Fan die Komponenten direkt in die IDE rein zu kompilieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2212
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Strategie und Struktur für Packages/Komponenten
Ich strukturiere meine Packages sehr ähnlich zu meinen Projekten:
Wobei ich auch namespaces Nutze um interne und externe Funktionalitäten zu trennen. Ein gutes Beispiel hier ist meine Iterator Bibliothek die Unit "Iterators" ist die die die Nutzer einbinden müssen in ihr Projekt, welche intern dann die "Iterator.XYZ" Units benutzt. Somit habe ich zwar viele verschiedene Units um meinen Code schön logisch zu Struzkturieren, wer die Bibliothek aber benutzen will muss nur eine einzige Unit zur uses-Klausel hinzufügen.
Und bei den Unittests, wenn ich überhaupt welche habe, bin ich sehr low effort einfach ein simples Program mit exit codes baue, und mir grade schnell einen Testrunner in Python zusammen hacke. Wirkliche testing Frameworks benutze ich eigentlich nie.
Also für die Arbitrary Precision Number Unit die ich grade bastel sieht der test wirklich einfach so aus:
Code: Alles auswählen
<root>/package.lpk
<root>/Readme.md
<root>/src/... # Source files
<root>/examples/... # Beispiele
<root>/doc/... # Markdown dokumentation falls notwendig
<root>/tests/... # Unittests falls notwendig
Und bei den Unittests, wenn ich überhaupt welche habe, bin ich sehr low effort einfach ein simples Program mit exit codes baue, und mir grade schnell einen Testrunner in Python zusammen hacke. Wirkliche testing Frameworks benutze ich eigentlich nie.
Also für die Arbitrary Precision Number Unit die ich grade bastel sieht der test wirklich einfach so aus:
Code: Alles auswählen
{ %INCLUDE=utils }
Program TestCompare;
uses
Numbers;
begin
if -TInteger(0) < TInteger(0) then
Halt(1);
if -TInteger(3) < -TInteger(5) then
Halt(2);
...
WriteLn('Ok');
end.
Re: Strategie und Struktur für Packages/Komponenten
Warum nicht? Ich aktualisiere gerade ein Bund an fremden, also nicht von mir, Open Source Bibliotheken und bin sehr froh das diese Tests haben. So gehe ich sicher das Bibliotheken auch danach laufen. Ohne Tests fasse ich das Zeug sonst nicht an, da zu unsicher.Warf hat geschrieben: Do 16. Okt 2025, 19:02 Und bei den Unittests, wenn ich überhaupt welche habe, bin ich sehr low effort einfach ein simples Program mit exit codes baue, und mir grade schnell einen Testrunner in Python zusammen hacke. Wirkliche testing Frameworks benutze ich eigentlich nie.
Auch sonst wenn die Software noch einen kleinen Umfang hat, erspart man sich viele Probleme, wenn man Tests hat und sieht, ob noch alles zusammen passt. Also ich mag Tests
-
- Beiträge: 2212
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Strategie und Struktur für Packages/Komponenten
Ich mag auch tests, wenn ich was mache was sich gut testen lässt fang ich meistens damit an das ich die Tests schreibe was funktionieren soll und danach erst meinen Code so baue das das was ich vorhabe auch Funktioniert.
Das Problem ist eher das in vielen Situationen tests zu schreiben sehr kompliziert sein kann. Meine letzten 3 großen Projekte die live gegangen sind, waren meine Websockets Bibliothek, meine ANSI Escape Sequence Terminal Bibliothek und meine Co-routine implementation. Die automatisiert zu testen ist echt nicht so angenehm, bei der Websocket Bibliothek hatte ich am anfang den Clienten gegen den Server getestet, was sich gut als unit test machen lässt. Problem wenn ichs benutzen wollte ging sehr viel kaputt, weil ich im Grunde meine eigenen Bugs und Misverständnisse getestet habe. Daher hab ich da statt tests einfach mehrere Examples die die ganze Funktionalität abdecken sollen gebaut.
Bei der Terminal Bibliothek ist das sehr ähnlich, hier ist die Hauptfehlerquelle inkompatibilitäten mit verschiedenen Terminal Emulatoren, daher hab ich da auch vor allem sehr viele Beispielprogramme drin.
Unittests machen erst Sinn wenn man wirklich komplexe Logik Baut. Bei meinem Compiler Compiler an dem ich seit letztem Jahr sitze hab ich vor allem extrem viele für die DFA Konstruktion und parser, weil sich die einfach testen lässt. Für ein anderes Projekt brauche ich einen Arbitray but Fixed Sized Integer typen, den kann man auch gut mit unittests testen.
Der Grund warum ich kein Testing Framework verwende ist aber super simpel, ich brauchs nicht wirklich, ich hab einfach meinen Python Testrunner der durch alle tests in einem Ordner durchiteriert, über Kommentare im code configuriert werden kann, und einfach nur testet:
1. Kompiliert es (und solle es das)
2. Wenn ich den Test ausführe, returned der 0 (success) oder einen Fehlercode, und am ende zeigt der mir die tests an die Fehlschlagen.
Keine packeges oder andere dependencies, nur ein 200 zeilen Python script und standard .pas dateien, mehr ist für meine Tests nicht notwendig
Bei meinem letzten C Projekt einem Emulator, hab ich die einfach direkt mit in den Makefile gelegt, dann wars sogar teil des regulären buildsystems
Das Problem ist eher das in vielen Situationen tests zu schreiben sehr kompliziert sein kann. Meine letzten 3 großen Projekte die live gegangen sind, waren meine Websockets Bibliothek, meine ANSI Escape Sequence Terminal Bibliothek und meine Co-routine implementation. Die automatisiert zu testen ist echt nicht so angenehm, bei der Websocket Bibliothek hatte ich am anfang den Clienten gegen den Server getestet, was sich gut als unit test machen lässt. Problem wenn ichs benutzen wollte ging sehr viel kaputt, weil ich im Grunde meine eigenen Bugs und Misverständnisse getestet habe. Daher hab ich da statt tests einfach mehrere Examples die die ganze Funktionalität abdecken sollen gebaut.
Bei der Terminal Bibliothek ist das sehr ähnlich, hier ist die Hauptfehlerquelle inkompatibilitäten mit verschiedenen Terminal Emulatoren, daher hab ich da auch vor allem sehr viele Beispielprogramme drin.
Unittests machen erst Sinn wenn man wirklich komplexe Logik Baut. Bei meinem Compiler Compiler an dem ich seit letztem Jahr sitze hab ich vor allem extrem viele für die DFA Konstruktion und parser, weil sich die einfach testen lässt. Für ein anderes Projekt brauche ich einen Arbitray but Fixed Sized Integer typen, den kann man auch gut mit unittests testen.
Der Grund warum ich kein Testing Framework verwende ist aber super simpel, ich brauchs nicht wirklich, ich hab einfach meinen Python Testrunner der durch alle tests in einem Ordner durchiteriert, über Kommentare im code configuriert werden kann, und einfach nur testet:
1. Kompiliert es (und solle es das)
2. Wenn ich den Test ausführe, returned der 0 (success) oder einen Fehlercode, und am ende zeigt der mir die tests an die Fehlschlagen.
Keine packeges oder andere dependencies, nur ein 200 zeilen Python script und standard .pas dateien, mehr ist für meine Tests nicht notwendig
Bei meinem letzten C Projekt einem Emulator, hab ich die einfach direkt mit in den Makefile gelegt, dann wars sogar teil des regulären buildsystems