Как создавать бинарные дистрибутивы приложений с помощью cabal (инструмент) или стека

Я написал приложение на Haskell, и оно стало немного полезным для пользователей. Однако мое приложение не нацелено на технически подготовленных людей, не говоря уже о разработчиках Haskell, поэтому создание моего приложения из исходных текстов на самом деле не то, чего я могу ожидать от них.

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

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

Cabal (библиотека), похоже, обладает необходимыми для этого функциями. Обычные сценарии (без cabal (инструмент) или стека в качестве оберток) поддерживают такие параметры, как и, которые позволяют вам установить пакет с заданным префиксом и скомпилировать их таким образом, чтобы гарантировать, что файлы данных все еще могут быть обнаружены, если префикс ( в целом) перемещен в другое место.

Но используя сырые имеет обратную сторону: он не обрабатывает автоматическую установку зависимостей. А поскольку многие приложения на Haskell приличного размера будут иметь сотни зависимостей (или, по крайней мере, у меня есть), настройка и сборка каждого из них вручную на самом деле неосуществима.

Очевидным решением проблемы установки зависимостей было бы использование инструмента-оболочки, такого как 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.

Другие вопросы по тегам