2012-03-25 14 views
17

¿Cuál es la mejor/correcta práctica para especificar la versión dentro del árbol de código fuente? Lo que quiero es, por ejemplo, poner el archivo VERSION en el nivel superior del árbol fuente y obtener la función "versión" para leerlo.Haskell: ¿Práctica correcta para especificar la versión en la fuente?

Hay una sección de versión en el archivo cabal. ¿Es posible leerlo desde mi fuente mediante funciones de "ayuda" o "versión"? ¿Cuál es la práctica correcta de especificar la versión en un lugar y hacerla disponible globalmente?

P.S. ¿Hay alguna función en la biblioteca Cabal que le permita extraer cualquier sección del archivo cabal y presentarla en su fuente? Entonces podría simplemente extraer la sección de versión del archivo cabal.

- ACTUALIZACIÓN -

Gracias Thomas por un buen pedazo de conocimiento sobre el módulo Pathes_x. Solo quería agregar que, aparentemente, no necesito poner nada en mi archivo cabal. Todo simplemente funciona sin eso. Todo lo que necesitaba era importar el Pathes_X tal como lo trataste. Además, necesitaba importar Data.Version para obtener la función showVersion para formatear/imprimir correctamente el tipo de datos de la versión. Así que al final me sale algo como esto:

import Paths_kvman 
import Data.Version 

runVersion _ = putStrLn ("Version: " ++ (showVersion version)) 

Ahora, todo lo que necesito es cambiar el número de versión en el archivo de Cabal a propagade todo de mi fuente. Exactamente lo que necesitaba. Gracias.

Respuesta

22

Cabal genera automáticamente un módulo para cada paquete llamado Paths_packagename. Solo importe este paquete y mire el valor version que exporta.

Editar: Por ejemplo:

module Data.Blah where 

import Paths_t 

func :: IO() 
func = print version 

Y un ejemplo Run:

> func 
Version {versionBranch = [0,1], versionTags = []} 

Asegúrese de poner Paths_packagename en su sección Other-Modules del archivo de Cabal.

+0

Eso debería hacerlo :) –

+0

Wow. No tenía ni idea. –

+1

buen consejo! ¿Qué tal tener un blog con "el consejo de la camarilla de la semana"? Me suscribiría seguro. –

1

La mejor práctica es poner el número de versión en su archivo cabal, como ya ha indicado.

No conozco ninguna buena práctica por la que pueda mantener un solo punto de verdad acerca de la versión, sin embargo, haga que el número esté disponible tanto para cabal como para su aplicación.

recomendaría un solo archivo Version.hs en las fuentes con estos contenidos:

module Version 
where 
version :: String 
version = "3.14159" 

A continuación, podría, si hubiese deseado, utilice algún tipo de secuencia de comandos para actualizar el archivo de Cabal con este número, pero Don No sé cómo hacer esto desde el interior de la camarilla.

Esta estrategia funcionará solo para paquetes de aplicaciones; Si está construyendo una biblioteca, tendrá que pensar en dónde en el espacio de nombres de los módulos jerárquicos llegará su Version.hs.

En general, sospecho que el juego no vale la pena.


P.S. El número de versión debe ser inmutable, por lo que desea un valor, no una función.

+0

Gracias Norman, por función me refería a lo que llamo cuando se especifica el interruptor -h o -v. Es un valor de manera inicial. Pero este valor es eventualmente llamado por una función que gobierna -v o -h interruptores. ¿Derecha? –

+1

@ r.sendecky, cuando tiene un modificador de línea de comandos realizará algún tipo de acción monádica como 'putStrLn $" Versión: "++ Version.version' –

Cuestiones relacionadas