2010-05-12 12 views
6

En la sección dependencias de un archivo de Cabal:dependencias del paquete hackage y bibliotecas preparadas para el futuro

Build-Depends: base >= 3 && < 5, transformers >= 0.2.0 

debería hacer algo así como

Build-Depends: base >= 3 && < 5, transformers >= 0.2.0 && < 0.3.0 

(poner límites superiores en las versiones de los paquetes que dependo en)

¿o no?

voy a utilizar un ejemplo real: mi paquete "Lista" en la Hackage (transformador Lista mónada y la clase)

  • Si no pongo el límite - mi paquete puede romperse por un cambio en " transformadores "
  • Si pongo el límite - un usuario que usa" transformadores "pero está usando una versión más nueva de él no podrá usar lift y con ListT porque es solo una instancia de estas clases de transformadores-0.2 .x

Supongo que las aplicaciones siempre deben poner límites superiores para que nunca se rompan, por lo que esta pregunta solo se trata de bibliotecas:

¿Usaré el límite de versión superior en dependencias o no?

Respuesta

4

Hay un policy explícito que recomienda límites superiores; consulte en particular la sección 3 ("Dependencias en Cabal"). Las otras respuestas dan alguna justificación adicional para esta política.

En resumen: el límite superior debe ser en forma de < A.(B+1) donde A y B son los primeros elementos de la versión actual (A.B.C...). Esto se debe a que aumentar A.B debería significar que la versión rompe las antiguas API.

+2

Agregué un resumen rápido de la política mencionada a su respuesta. Espero que no te importe, pero si lo haces, siéntete libre de cambiar/reformular/revertirlo. – yairchu

1

IMO poner límites superiores en los números de versión aceptados es lo correcto. Dada la semántica de los números de versión utilizados por Hackage, no hay garantía de que su paquete funcione con, en este caso, los transformadores 0.3.0.

No he visto ninguna discusión real sobre esto sin embargo y no parece haber una recomendación general de usar límites superiores excepto para el paquete base.

2

Piense en los modos de fallo:

  • Con el límite superior, ya sea su paquete construye o Cabal bala alrededor de una dependencia de construcción insatisfecho. La culpa está claramente asignada.

  • Sin límite superior, el cliente tiene una versión reciente de transformadores y no es compatible con versiones anteriores. Su software no puede construir; GHC bleats acerca de cómo su código no compila. Tu software se ve de mala calidad.

Poner en el límite superior.

+0

Con el límite superior, cabal no se queja de una dependencia de compilación insatisfecha, lo probé e imprime "Advertencia: Este paquete depende indirectamente de varias versiones del mismo paquete . Esto es muy probable que cause un error de compilación. ".Entonces, el paquete del cliente probablemente no podrá compilarse debido a una instancia faltante – yairchu

+1

@yairchu: ¿eso significa que un paquete que importó en su paquete depende de 'transformadores', pero tiene restricciones de versión diferentes? – jberryman

+0

@jberryman: exactamente. mi paquete de prueba depende de List, que depende de los transformadores> = 0.2.0 y en MaybeT-transformers que depende de los transformadores 0.1. * – yairchu

Cuestiones relacionadas