2011-09-15 4 views
15

Soy el responsable de mantener un paquete en hackage, lrucache. Recientemente recibí una solicitud de función para agregar instancias para Binary y NFData. Ambas cosas son útiles, y no tengo ningún problema con esas instancias, en principio.Cómo tratar solicitudes de funciones que agregan nuevas dependencias de paquetes

Sin embargo, ambos presentan nuevas dependencias de paquetes, y quiero mantener la lista de dependencias de mi paquete lo más mínima posible. ¿Hay una forma sensata de manejar esto? Probablemente hay más de veinte paquetes diferentes que proporcionan clases de tipos útiles que podrían implementar las estructuras de datos en lrucache, y obtener algún beneficio de.

Obviamente, agregar todos ellos como dependencias no es un comienzo. Pero, ¿qué más se puede hacer?

Puedo agregar banderas a lrucache.cabal que permitirán compilar varias instancias. Eso funciona, en términos de hacer que la lista de dependencias sea mínima, excepto cuando la desee. Pero es horrible en el mundo real, porque no se pueden especificar indicadores de compilación en las secciones dependientes de la compilación. Entonces puede confiar en un paquete con una bandera en particular, pero no especificar esa dependencia. Esto rápidamente se reduce a casi inutilidad.

Puedo crear un conjunto de paquetes de instancias huérfanas. Esto tiene la ventaja de permitir que dependencias en esas instancias se especifiquen en una sección dependiente de la compilación. Su principal desventaja es agregar una tonelada de paquetes adicionales a hackage, y la necesidad de mantenerlos como paquetes separados.

¿Qué más puedo hacer? ¿Qué es lo correcto?

+2

El enfoque del "paquete de instancias huérfanas" parece ser una estrategia común, al menos. Lo correcto es probablemente inventar una mejor administración de la dependencia, pero ... –

+1

@C. A. McCann, personalmente no me gusta cuando el software usa './configure--enable-Z'. Me gustan las cosas simples: tener un paquete marcado como "instalado" significa que está instalado, no "está instalado con las opciones X e Y, pero no Z". Quizás Hackage podría organizar mejor los paquetes de instancias huérfanas, pero no creo que sean ilegítimos en concepto. – gatoatigrado

+0

@gatoatigrado: Estoy de acuerdo. Cabal organizarlos mejor también calificaría como "mejor gestión de dependencia" como mencioné, así que siéntete libre de inventarlo. :] No estoy seguro de cuáles serían los obstáculos para implementar un sistema como ese. –

Respuesta

7

A falta de un sistema de dependencias opcional en el propio cabal (el sistema de embalaje), las opciones no son demasiado buenas.

Una opción es la siguiente. Puede crear un paquete adicional propio para cada paquete adicional con el que desee que se integre su paquete principal.

Por ejemplo, si desea lrucache para integrarse con binary, usted podría hacer un paquete adicional lrucache-binary que contiene la integración (en este caso, las instancias de clase de tipo). Del mismo modo, un nuevo paquete de su propia lrucache-nfdata para integrar lrucache con nfdata.

Entonces, si alguien quisiera tanto lrucache como su integración con binary, puede depender de [binary, lrucache, lrucache-binary].

+0

Eso es exactamente lo que el asunto de "paquetes de instancias huérfanas" mencioné es, creo. – Carl

3

¿Qué sucede si solo mantiene dos paquetes: lrucache, que depende de un trillón de cosas diferentes, y luego lrucache-lite (o lrucache-minimal) que es más o menos lo que tiene ahora. Entonces, si las personas quieren minimizar sus dependencias, usan la versión lite, y si no les importa tener un millón de dependencias, usan la versión estándar. El más grande probablemente dependería del lite, para evitar la duplicación del código.

+0

He visto esto con los nombres 'lrucache' y' lrucache-instances'. De esta forma, solo hay dos paquetes, pero no hay posibilidad de elegir y elegir instancias. –

0

Puedo agregar banderas a lrucache.cabal que permitirán compilar varias instancias de . Eso funciona, en términos de hacer que la lista de dependencias sea mínima, excepto cuando lo desee. Pero es horrible en el mundo real, porque no se pueden especificar indicadores de compilación en las secciones dependientes de la compilación. De modo que puede depender de un paquete con un indicador particular, pero no especificar esa dependencia . Esto rápidamente se reduce a casi inutilidad.

Esto podría ser exactamente lo que dices que no funciona para ti arriba, pero ¿puedes incluir tus importaciones y definiciones de clase en conditionally-compiled CPP pragmas? Supongo que envuelto alrededor de imports de módulos internos que a su vez importan una de sus "dependencias opcionales".

No he intentado esto, pero estoy muy interesado en saber la respuesta también.

+0

Sí, eso funciona. Pero digamos que lo hice, por ejemplo, para una instancia binaria. Digamos que estás escribiendo un programa que usa lrucache, y quiere usar la instancia binaria para serializarlo. No habría forma de indicar eso en la sección de desarrollo de tu archivo cabal. Ese es el problema con ese enfoque. – Carl

1

un poco tarde al juego, pero mis dos centavos:

  1. Un bibliotecas API pública (que incluye instancias de clases) nunca deben cambiar en función de la disponibilidad banderas construir o paquete - que está castigando por Down- desarrolladores de flujo y distribuidores de paquetes de distribución.

  2. Añadiré una dependencia sin cuestionar a nada en la Plataforma Haskell (excepto tal vez 'unix' o 'win32' o similares).

Eso todavía deja 'binario', sin embargo, de acuerdo a su página Hackage que está disponible en múltiples distribuciones de Linux, y en mi experiencia instala limpiamente en Windows. En este caso, aceptaría un parche, pero no lo autorizo ​​yo mismo.

Esto realmente no responde la pregunta directamente, pero con suerte ilustra el proceso de pensamiento que usaría.

Cuestiones relacionadas