Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell: Correct practice to specify version in source?

Tags:

haskell

What is the best/correct practice to specify version within your source code tree? What I want is, for instance, to put VERSION file in the top level of the source tree and get the "version" function to read it.

There is a version section in the cabal file. Is it possible to read it from my source by "help" or "version" functions? What is the correct practice of specifying the version in one place and making it available globaly?

P.S. Are there any functions in the Cabal library that allow you to pull any section from the cabal file and present it in your source? Then I could simply pull the version section from the cabal file.

-- UPDATE --

Thank you Thomas for an nice piece of knowledge about the Pathes_x module. Just wanted to add that, apparently, I don't need to put anything into my cabal file. Everything just works without it. All I needed was to import the Pathes_X as you sugested. Also, I needed to import Data.Version to get the showVersion function to properly format/print the Version data type. So at the end I get something like this:

import Paths_kvman
import Data.Version

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

Now, all I need is to change the version number in the cabal file to propagade it all over my source. Exactly what I needed. Thanks.

like image 950
r.sendecky Avatar asked Mar 25 '12 03:03

r.sendecky


2 Answers

Cabal automatically generates a module for each package named Paths_packagename. Just import this package and look at the version value it exports.

Edit: For example:

module Data.Blah where

import Paths_t

func :: IO ()
func = print version

And an example run:

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

Be sure to put Paths_packagename in your Other-Modules section of the cabal file.

like image 111
Thomas M. DuBuisson Avatar answered Oct 28 '22 15:10

Thomas M. DuBuisson


Best practice is to put the version number in your cabal file, as you have already noted.

I am not aware of any good practices by which you can maintain a single point of truth about the version, yet make the number available both to cabal and to your application.

I would recommend a single file Version.hs in the sources with these contents:

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

You could then, if you wished, use some kind of script to update the cabal file with this number, but I don't know how to do this from within cabal itself.

This strategy will work only for application packages; if you are building a library, you'll need to give some thought to where in the namespace of hierarchical modules your Version.hs will go.

On the whole, I suspect the game is not worth the candle.


P.S. The version number should be immutable, so you want a value, not a function.

like image 33
Norman Ramsey Avatar answered Oct 28 '22 16:10

Norman Ramsey