如何使用 cabal(工具)或堆栈创建应用程序的二进制分发版

Kri*_*itz 6 haskell cabal cabal-install haskell-stack cabal-new

我已经用 Haskell 编写了一个应用程序,它开始对用户有点用处了。然而,我的应用程序并不是针对技术娴熟的人,更不用说 Haskell 开发人员了,所以从源代码构建我的应用程序并不是我真正可以期望他们做的事情。

因此,为了让我的用户可以使用我的应用程序,我想自己构建应用程序,将其可执行文件、数据文件、依赖项、依赖项的数据文件、所需的许可信息和其他所需的文件放入一个存档中,然后将该存档放在一个网站。现在,用户可以下载该存档,解压缩它并拥有运行我的应用程序所需的一切。

我上面描述的过程似乎是向我分发应用程序二进制文件的一种相当常见的方式。但是,我无法弄清楚要使用哪些工具或如何配置它们以将我的应用程序构建到上述二进制分发版中。

Cabal(图书馆)似乎具有所需的功能。通常的Setup.hs脚本(没有 cabal(工具)或堆栈作为包装器)支持诸如--prefix和 之类的选项,--enable-relocatable它允许您将包安装到给定的前缀并以这样的方式编译它们,以确保如果前缀(作为一个整体)被移动到其他地方。

但是使用 rawSetup.hs的缺点是它不处理自动安装依赖项。而且由于许多大小合适的 Haskell 应用程序将有数百个依赖项(或至少我的),手动配置和构建它们中的每一个并不是真正可行的。

安装依赖项问题的明显解决方案是使用包装器工具,例如 cabal(工具)或堆栈,因为它们是专门用于处理大型依赖项树的问题。但是,它们似乎都有问题阻止我将应用程序构建为二进制分发版:

  • stack build没有选项--prefixor--enable-relocatable而总是安装到.stack-workand ~/.stack

  • cabal v2-*有选项--prefix--enable-relocatable但似乎完全忽略它们,而是始终安装到dist-newstyle~/.cabal

  • cabal v1-*对于非常简单的情况,似乎可以做我想做的事情。然而,对于更复杂的情况,它会产生模糊的构建失败,其中 GHC 抱怨没有从依赖项中找到模块,而 cabal 抱怨部分安装的包。但即使将这些故障放在一边,对新工作流使用旧命令一般来说似乎也不是一个好主意。

那么,由于我似乎对这些工具不太走运,我可以使用哪些其他工具将 Haskell 应用程序构建为二进制发行版?或者,也许我列出的工具之一实际上可以满足我的需求,而我只是以错误的方式使用它?

范围的一些限制:

  • 现在我最感兴趣的是 Windows 的构建,但其他平台的解决方案也会很有趣。
  • 当我谈论依赖项时,我主要指的是 Haskell 依赖项(即 Cabal 包)。还捆绑外部 C 依赖项的解决方案会很有趣,但这不是一个严格的要求。

Nou*_*are 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
...
Run Code Online (Sandbox Code Playgroud)

这应该负责构建所有依赖项,同时仍然能够使用Setup.hs.

我认为如果您的依赖项使用data-files.