Как вы выпускаете проект * nix?
Итак, я написал аккуратную небольшую программу, которая может анализировать японский текст и предоставлять пользователю различные статистические данные о Kanji в нем и Я хотел бы выпустить эту программу в мир. Проблема в том, что я понятия не имею, как создать "выпуск".
Я понимаю, что * nix-системы часто помещают исполняемые файлы (или символические ссылки) в такие места, как /usr/bin, и что скрипты сборки часто помещают их там автоматически, но, оказывается, я пошел и написал это в Haskell.
Тогда просто используйте cabal!
... Я слышал, вы говорите. Ну, я бы, кроме того, что моя программа имеет большое количество файлов данных, которые она считывает, и, конечно, программа должна знать, где эти файлы. Используя cabal, не будет ли исполняемый файл не брошен в какой-то странный путь к файлу проекта a la:
/usr/share/haskell/cabal/morecabal-1.0.4/myproject-1.3.4.1.a/thisisridiculous/
В настоящий момент я запускаю исполняемый файл из его исходного каталога и ищет файлы данных в "./data".
Существует ли типичный формат путей установки, чтобы я мог заранее сказать свою программу в источнике, где искать данные?
Моя конечная цель - сделать это пакетом Arch Linux. Может ли кто-нибудь помочь мне начать?
Для любопытных здесь существует git repo. Заранее благодарим за любую помощь, которую вы можете дать.
Ответы
Ответ 1
Посмотрите, как существующий проект Haskell, например Gitit, упакован для Arch linux. В частности, PKGBUILD.
Вы также можете скачать Gitit tarball и посмотреть, как использовать директиву data-files:
в файле gitit.cabal
.
Я не читаю Haskell, но из того, что я понимаю из источника, файл Paths_gigit.hs
(который можно найти здесь. ) генерируется cabal, так что вам нужно только беспокоиться об относительных путях. Затем это просто вопрос импорта и использования функции getDataFileName
.
Упаковка для Arch:
Упаковка для кабины:
Упаковка для обоих:
Ответ 2
Портативный способ привязки файлов данных в проекте Cabal должен называть их в свойстве data-files
в вашем файле .cabal
.
Cabal будет генерировать модуль под названием Paths_packagename
, который определяет функцию
getDataFileName :: FilePath -> IO FilePath
который ваш код может использовать для определения того, где были установлены файлы данных.
Смотрите: Доступ к файлам данных из кода пакета