Подтвердить что ты не робот

Haskell: Правильная практика для указания версии в источнике?

Какова наилучшая/правильная практика для указания версии внутри вашего исходного кода? Я хочу, например, разместить файл VERSION на верхнем уровне исходного дерева и получить функцию "версия" для его чтения.

В файле cabal есть раздел версии. Можно ли прочитать его из моего источника с помощью функций "help" или "version"? Какова правильная практика указания версии в одном месте и ее доступности в глобальном масштабе?

P.S. Существуют ли какие-либо функции в библиотеке Cabal, позволяющие вытащить любой раздел из файла cabal и представить его в вашем источнике? Затем я мог просто вытащить версию из файла cabal.

- ОБНОВЛЕНИЕ -

Спасибо Томасу за приятную информацию о модуле Pathes_x. Просто хотел добавить, что, по-видимому, мне не нужно вносить что-либо в свой файл кэша. Все работает без него. Все, что мне было нужно, это импортировать Pathes_X по мере того, как вы писались. Кроме того, мне нужно было импортировать Data.Version, чтобы заставить функцию showVersion правильно форматировать/печатать тип данных версии. Поэтому в конце я получаю что-то вроде этого:

import Paths_kvman
import Data.Version

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

Теперь мне нужно только изменить номер версии в файле cabal, чтобы распространять его по всему моему источнику. Именно то, что мне нужно. Спасибо.

4b9b3361

Ответ 1

Cabal автоматически создает модуль для каждого пакета с именем Paths_packagename. Просто импортируйте этот пакет и посмотрите на значение version, которое он экспортирует.

Изменить: Например:

module Data.Blah where

import Paths_t

func :: IO ()
func = print version

И пример запуска:

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

Обязательно поместите Paths_packagename в свой Other-Modules раздел файла cabal.

Ответ 2

Лучше всего поместить номер версии в ваш файл кэша, как вы уже отметили.

Мне не известно о каких-либо хороших практиках, с помощью которых вы можете поддерживать единую точку зрения о версии, но при этом сделать число доступным как для кэбала, так и для вашего приложения.

Я бы порекомендовал один файл Version.hs в источниках с этим содержимым:

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

Если бы вы захотели, вы могли бы использовать какой-то script для обновления файла cabal с этим номером, но я не знаю, как это сделать изнутри самой кабалы.

Эта стратегия будет работать только для пакетов приложений; если вы создаете библиотеку, вам нужно подумать о том, где в пространстве имен иерархических модулей будет отправлен ваш Version.hs.

В целом, я подозреваю, что игра не стоит свечи.


P.S. Номер версии должен быть неизменным, поэтому вам нужно значение, а не функция.