Quelles sont les meilleures pratiques pour la gestion des packages Cabal connexes?
Question
Je travaille sur une bibliothèque d'optimisation basée sur le flux de données écrit en Haskell. Il semble maintenant probable que la bibliothèque va devoir être divisé en deux parties:
-
core pièce avec un minimum de dépendances de construction; appeler
hoopl-core
. -
complet pièce, appelez
hoopl
, ce qui peut avoir des dépendances supplémentaires sur les paquets comme un prettyprinter, QuickCheck, et ainsi de suite.
L'idée est que le compilateur Glasgow Haskell ne dépendra que de hoopl-core
, de sorte qu'il ne sera pas trop difficile pour l'amorçage du compilateur. D'autres compilateurs obtenir les goodies supplémentaires dans hoopl
. Forfait hoopl
dépendra hoopl-core
.
Les outils de paquets Debian peuvent construire des paquets multiples à partir d'un seul arbre source. Malheureusement Cabal n'a pas encore atteint ce niveau de sophistication . Mais il doit y avoir d'autres concepteurs de bibliothèques ou d'application là-bas qui ont des problèmes similaires (par exemple, un paquet pour une bibliothèque de base, une autre pour une interface de ligne de commande, une autre pour une interface graphique).
Quelles sont les meilleures pratiques actuelles pour la construction et la gestion de plusieurs paquets Haskell liés à l'aide de Cabal?
La solution
Je mettrais les deux paquets dans des sous-répertoires séparés, et ont un Makefile
avec quelque chose comme ceci:
.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
cela suppose que vous avez le processus par un bootstrap premier bâtiment hoopl-core et l'enregistrer (--inplace
), puis la construction hoopl
. Vous pouvez automatiser plus de cela en utilisant le Makefile.
Comme vous le savez, quand nous voulions des fonctionnalités similaires pour GHC, nous avons écrit notre propre système de construction à la place ;-) Je ne recommande pas. Je suppose que techniquement il serait possible d'extraire du système de compilation GHC les pièces nécessaires et faire un cadre réutilisable, mais ...
Autres conseils
Mettre les deux paquets dans les sous-répertoires distincts de votre repo de contrôle de code source, et utiliser deux fichiers cabale séparés.
Assurez-vous d'utiliser l'opération de déplacement de votre système de contrôle de code source lorsque les fichiers en mouvement, de sorte qu'il retrace l'histoire correctement.