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, чтобы распространять его по всему моему источнику. Именно то, что мне нужно. Спасибо.
Ответы
Ответ 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. Номер версии должен быть неизменным, поэтому вам нужно значение, а не функция.