在Homebrew上分发Haskell程序

6
我正在我的Mac上使用Haskell编写程序(命令行可执行文件,而不是应用程序)。我使用GitHub托管git存储库和主页。我创建了<project>.cabalSetup.hs文件,因为Cabal使构建、测试和生成文档变得简单。我可能还会上传到Hackage,但我不确定。
当我标记版本1.0时,我想制作一个Homebrew公式来从GitHub下载tarball并构建它。我希望唯一的依赖项是GHC。
我将使用runhaskell Setup configure/build/install(前缀为/usr/local/Cellar/...),而不是依赖于cabal-install命令。
这都很好,直到我开始使用来自Hackage的软件包,例如blaze-builder和aeson。我该如何管理这些?
我不想强制非Haskell程序员下载整个Haskell平台。理想情况下,人们只需让Homebrew在构建我的程序之前安装GHC,然后如果他们选择,就可以删除GHC。如果我将Haskell平台作为依赖项,并通过cabal-install或类似工具首先安装我的Haskell依赖项,
  1. 即使之后执行
    brew uninstall haskell-platform~/.cabal/文件夹中的软件包也会被保留。
  2. 我可能只是通过Hackage并让人们cabal install它,即在很大程度上限制了Haskellers的范围。
我认为Cabal(-install) + Hackage是开发和Haskellers的有用工具,但不适合这种情况。
我应该只下载我正在使用的软件包的源代码并将其包含在我的源代码树中,并将其添加到构建命令中吗?还是应该使用--package-db选项(在这里找到)?或者我的公式可以动态下载软件包的tarball并进行构建?

我稍微看了一下cabal2arch(Arch wikiGitHub repo),但我不确定它如何处理依赖关系,或者它是否只是在做我不想做的事情。


4
把二进制文件分发出去,这样非 Haskell 开发者就不需要自己编译了,这样做会更容易些。在 Haskell wiki 中提到了一个打包工具,Haskell 开发者可以使用 cabal 从源代码构建应用程序。 - mmmmmm
1
你提到的链接是用于应用程序包,而我的程序是一个命令行工具。使用应用程序包会更容易,但我真的很喜欢Homebrew作为软件包管理器,并且它喜欢从源代码构建所有内容(请参见https://github.com/mxcl/homebrew/wiki/FAQ中的“为什么要编译所有内容?”部分)。你可以在Homebrew中使用“瓶子”,但那只适用于需要数小时才能构建的东西(如Qt),而且你不能将二进制文件放在任何地方。 - mk12
1
但是大多数用户没有 Homebrew,相对于使用软件包管理器下载程序,直接下载编译好的二进制文件对用户来说肯定更简单。如果您必须使用一个管理器,请尝试使用 MacPorts,并将代码打包成一个端口,这样 MacPorts 就会在集中位置构建它,然后用户就可以下载预先构建的二进制文件。 - mmmmmm
1
我并不是很喜欢Macports,如果我要发布一个二进制文件,我也不知道应该把它托管在哪里。我只是想为使用Homebrew的人提供一个方便的单行命令,我所面临的唯一障碍是如何处理Hackage的依赖关系。这并不是一个实际的分发问题,而是一个如何做这个特定事情的问题。 - mk12
有没有办法制作一个homebrew公式来安装blaze-builder、aeson等,并将它们添加为依赖项? - Daniel Wagner
显示剩余2条评论
2个回答

1
在我看来,如果你决定使用包管理器,你应该确保所有依赖项都可以构建或以其他方式轻松获得。如果你只依赖GHC及其核心库集,那么就不需要同时构建整个平台。
然而,如果你希望从源代码构建(在我的意见中,在许多但不是全部情况下这是一个好主意),那么构建所有依赖项是你必须面对的问题。我们在HPC环境中用于部署科学软件到超级计算机上的构建系统[1]也是如此。但这确实需要付出代价。启动这样的系统可能需要相当长的时间,因为你需要整个工具链和所有所需的库都存在。
事实上,就在我们说话的时候,我正在我们的构建系统中添加对GHC和Haskell包的支持,是的,如果需要,依赖项也会被拉取。至少,我会确保我们可以部署cabal,以便我们的用户可以在他们的账户上安装Haskell的东西。
简而言之,添加对依赖项的支持。
[1] http://hpcugent.github.com/easybuild

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接