Was sind Best Practices für die Verwaltung verwandter Kabalenpakete?
Frage
Ich arbeite an einer in Haskell geschriebenen Datenflow-basierten Optimierungsbibliothek. Es ist jetzt wahrscheinlich, dass die Bibliothek in zwei Teile aufgeteilt werden muss:
EIN Ader Stück mit minimalen Build -Abhängigkeiten; nennen
hoopl-core
.EIN voll Stück, nenn es
hoopl
, was zusätzliche Abhängigkeiten von Paketen wie einem hübschen Drucker, QuickCheck usw. haben kann.
Die Idee ist, dass der Glasgow -Haskell -Compiler nur davon abhängt hoopl-core
, damit es nicht zu schwierig ist, den Compiler zu starten. Andere Compiler erhalten die zusätzlichen Leckereien in hoopl
. Paket hoopl
wird abhängig von hoopl-core
.
Die Debian -Paket -Tools können mehrere Pakete aus einem einzigen Quellbaum erstellen. Leider Cabal hat diese Raffinesse noch nicht erreicht. Es muss jedoch andere Bibliotheks- oder Anwendungsdesigner geben, die ähnliche Probleme haben (z. B. ein Paket für eine Kernbibliothek, eine andere für eine Befehlszeilenschnittstelle, eine andere für eine GUI-Schnittstelle).
Was sind aktuelle Best Practices für das Erstellen und Verwalten mehrerer Haskell -Pakete mit Cabal?
Lösung
Ich würde die beiden Pakete in separate Unterverzeichnisse einfügen und eine haben Makefile
mit so etwas:
.PHONY: all hoopl hoop-core
all : hoopl
hoopl : hoopl-core
cd hoopl && cabal build && cabal register --inplace
hoopl-core
cd hoopl-core && cabal build && cabal register --inplace
Dies sieht davon aus--inplace
) und dann bauen hoopl
. Sie können mehr davon mit der Makefile automatisieren.
Wie Sie wissen, haben wir, wenn wir eine ähnliche Funktionalität für GHC wollten, stattdessen unser eigenes Build-System geschrieben ;-) Ich empfehle das nicht. Technisch denke ich, es wäre möglich, aus dem GHC-Build-System die erforderlichen Teile zu extrahieren und ein wiederverwendbares Rahmen zu erstellen ...
Andere Tipps
Legen Sie die beiden Pakete in separate Unterverzeichnisse Ihres Quellvertretungsrepo und verwenden Sie zwei separate Cabal -Dateien.
Stellen Sie sicher, dass Sie den Verschiebungsbetrieb Ihres Quellensteuerungssystems beim Verschieben von Dateien verwenden, damit der Verlauf ordnungsgemäß verfolgt.