Как создавать бинарные дистрибутивы приложений с помощью cabal (инструмент) или стека
Я написал приложение на Haskell, и оно стало немного полезным для пользователей. Однако мое приложение не нацелено на технически подготовленных людей, не говоря уже о разработчиках Haskell, поэтому создание моего приложения из исходных текстов на самом деле не то, чего я могу ожидать от них.
Итак, чтобы сделать мое приложение доступным для моих пользователей, я хотел бы создать приложение самостоятельно, поместить его исполняемый файл, файлы данных, зависимости, файлы данных зависимостей, необходимую информацию о лицензировании и другие необходимые файлы в один архив и поместить этот архив в интернет сайт. Теперь пользователи могут скачать этот архив, распаковать его и получить все необходимое для запуска моего приложения.
Описанный выше процесс кажется довольно распространенным способом распространения мне двоичных файлов приложений. Однако я не могу понять, какие инструменты использовать или как их настроить для встраивания моего приложения в двоичный дистрибутив, описанный выше.
Cabal (библиотека), похоже, обладает необходимыми для этого функциями. Обычные сценарии (без cabal (инструмент) или стека в качестве оберток) поддерживают такие параметры, как и, которые позволяют вам установить пакет с заданным префиксом и скомпилировать их таким образом, чтобы гарантировать, что файлы данных все еще могут быть обнаружены, если префикс ( в целом) перемещен в другое место.
Но используя сырые
Очевидным решением проблемы установки зависимостей было бы использование инструмента-оболочки, такого как cabal (инструмент) или стек, поскольку они специально созданы для решения проблемы больших деревьев зависимостей. Однако у всех них, похоже, есть проблемы, мешающие мне создать свое приложение как двоичный дистрибутив:
не имеет опций или вместо этого всегда устанавливается в и . есть варианты и но, похоже, полностью игнорирует их и вместо этого всегда устанавливает и . кажется, делает то, что я хочу, в очень простых случаях. Однако в более сложных случаях это приводит к неясным сбоям сборки, когда GHC жалуется на то, что не находит модули из зависимостей, а клика жалуется на частично установленные пакеты. Но даже если отбросить эти сбои, использование устаревших команд для нового рабочего процесса в целом не кажется хорошей идеей.
Итак, поскольку мне кажется, что мне не повезло с этими инструментами, какие еще инструменты я могу использовать для сборки приложений Haskell в двоичных дистрибутивах? Или, может быть, один из перечисленных мною инструментов действительно делает то, что я хочу, а я просто неправильно его использую?
Некоторые ограничения по объему:
- На данный момент меня больше интересуют сборки для Windows, но были бы интересны и решения для других платформ.
- Когда я говорю о зависимостях, я в основном имею в виду зависимости Haskell (то есть пакеты Cabal). Решения, которые также объединяют внешние зависимости C, были бы интересны, но это не строгое требование.
1 ответ
Обходной путь - использовать
cabal repl
вот так (из каталога с
your-package.cabal
):
$ cabal repl -b Cabal
...
ghci> :load /path/to/Setup.hs
...
ghci> :main configure --prefix=/my/prefix
...
ghci> :main build
...
ghci> :main copy --destdir=/my/dest/dir
...
Это должно позаботиться о создании всех ваших зависимостей, сохраняя при этом возможность использовать
Setup.hs
.
Я думаю, что это все еще может вызвать проблемы, если ваши зависимости используют
data-files
.