分发Haskell应用程序并更新它的最佳实践

时间:2016-06-17 06:53:08

标签: haskell cabal haskell-stack

TL;博士

大约一周前,我发布了第一个非平凡的Haskell项目的0.1.0.0软件包。我希望可执行文件易于安装和升级,即使对于非Haskeller也是如此。在the README中,我建议使用cabal install进行安装。这是一个错误吗?

上下文

我听说过“Cabal hell”,但没有意识到用户升级全球安装的软件包副本会有多么困难,即使我保守地没有更改{{{ 1}}文件。最后,我试图从0.1.0.0更新到0.2.0.0深入兔子洞。它警告我打破依赖关系,我尝试了各种咒语来强制升级或重置我的本地状态,并且使系统难以接受,以至于我不得不重新安装.cabalghc Brew包(这个在macOS上),以便将所有内容恢复到我可以安装并再次运行的状态。

备选方案:

  • cabal-install:我已经在使用Stack来管理本地开发环境了,但是对于独立安装它似乎也很好,只要你先安装了Stack。 (只需要适当地设置stack install。)
  • 分发预先构建的二进制文件:最终用户会很好,也很容易,但至少在OS X上,我需要担心代码签名,我甚至都没有为此设置身份。< / LI>

所以,在我的README中,我现在提到了$PATHstack install。但2016年最佳实践是什么?

1 个答案:

答案 0 :(得分:4)

看了你的.cabal file后,我发现你的依赖关系没有任何界限。你真的应该至少有下限,最好是下限和上限。

正如@Emanuel Borsboom所提到的,当你将包上传到Hackage时,你可以stack为你填写版本限制:

stack upload --pvp-bounds=both

事实上,对于应用程序,我建议在程序包中包含cabal.config生成的cabal freeze文件:

cabal freeze
mv cabal.config cabal.config-sample

当遇到构建来自Hackage的遗留应用程序的麻烦时,我常常希望作者包含这些信息。你可以得到 特定快照的cabal.config文件位于:

https://www.stackage.org/{RESOLVER}/cabal.config

stack.yaml文件中,我会使用标准LTS版本而不是nightly-。据说他们永远不会被删除。在另一 通过减少快照数量,您将帮助您的用户 他们必须维护的目录。