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

win*_*ent 7 haskell cabal haskell-stack

TL;博士

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

上下文

我听说过"Cabal hell",但没有意识到用户升级全局安装的软件包副本会有多么困难,即使我保守地没有改变.cabal文件中的任何版本依赖项.最后,我试图从0.1.0.0更新到0.2.0.0深入兔子洞.它警告我打破依赖关系,我尝试了各种各样的咒语来强制升级或重置我的本地状态,然后我就不得不重新安装ghc和使用cabal-installBrew软件包(这是在macOS上),以便让所有东西都恢复原状到我可以安装并再次运行的状态.

备择方案:

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

所以,在我的README中,我现在提到了两者stack installcabal install.但2016年的最佳做法是什么?

Eri*_*ikR 4

查看您的.cabal文件后,我发现您的依赖项没有任何限制。你确实应该至少有下限,最好有下限和上限。

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

stack upload --pvp-bounds=both
Run Code Online (Sandbox Code Playgroud)

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

cabal freeze
mv cabal.config cabal.config-sample
Run Code Online (Sandbox Code Playgroud)

当从 Hackage 构建遗留​​应用程序时遇到麻烦时,我经常希望作者包含这些信息。您可以cabal.config在以下位置获取特定快照的文件:

https://www.stackage.org/{RESOLVER}/cabal.config
Run Code Online (Sandbox Code Playgroud)

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

  • 最后,您可以忽略源“.cabal”文件中的约束,但使用“stack upload --pvp-bounds=both”将包上传到 Hackage。然后,Stack 将根据上传到 Hackage 的“.cabal”文件中的快照自动添加上限和下限。 (3认同)
  • 夜间快照不会被删除,但如果您不需要夜间快照,则使用 LTS 是一个很好的做法。 (2认同)