¿Cuáles son las mejores prácticas para administrar paquetes de Cabal relacionados?

StackOverflow https://stackoverflow.com/questions/2626630

  •  26-09-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top