¿Cuáles son las mejores prácticas para administrar paquetes de Cabal relacionados?
Pregunta
Estoy trabajando en una biblioteca de optimización basada en DataFlow escrita en Haskell. Ahora parece probable que la biblioteca tenga que dividirse en dos piezas:
A centro pieza con dependencias de construcción mínimas; llámalo
hoopl-core
.A completo pieza, llámalo
hoopl
, que puede tener dependencias adicionales en paquetes como PrettyPrinter, QuickCheck, etc.
La idea es que el compilador de Glasgow Haskell dependerá solo de hoopl-core
, para que no será demasiado difícil arrancar el compilador. Otros compiladores obtendrán las golosinas adicionales en hoopl
. Paquete hoopl
dependerá de hoopl-core
.
Las herramientas de paquetes de Debian pueden crear múltiples paquetes a partir de un solo árbol de origen. Desafortunadamente Cabal aún no ha alcanzado ese nivel de sofisticación. Pero debe haber otros diseñadores de biblioteca o aplicaciones que tengan problemas similares (por ejemplo, un paquete para una biblioteca central, otro para una interfaz de línea de comandos, otra para una interfaz GUI).
¿Cuáles son las mejores prácticas actuales para construir y administrar múltiples paquetes de Haskell relacionados con Cabal?
Solución
Pondría los dos paquetes en subdirectorios separados y tendría un Makefile
Con algo como esto:
.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
Esto supone que ha arrancado el proceso al construir primero el núcleo de hoopl y registrarlo (--inplace
) y luego edificio hoopl
. Podría automatizar más de esto usando el makfile.
Como saben, cuando queríamos una funcionalidad similar para GHC, escribimos nuestro propio sistema de construcción ;-) No lo recomiendo. Técnicamente, supongo que sería posible extraer del sistema de compilación de GHC las piezas requeridas y hacer un marco reutilizable, aunque ...
Otros consejos
Coloque los dos paquetes en subdirectorios separados de su repositorio de control de origen y use dos archivos de Cabal separados.
Asegúrese de utilizar la operación de movimiento de su sistema de control de origen al mover archivos, para que rastree el historial correctamente.