haskell - 分发 Haskell 应用程序和更新它的最佳实践

标签 haskell cabal haskell-stack

tl;博士

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

上下文

我听说过“Cabal hell”,但没有意识到用户升级全局安装的软件包副本有多么困难,即使我保守地实际上没有更改 .cabal 文件中的任何版本依赖项。最后,我陷入了一个深渊,试图从 0.1.0.0 更新到 0.2.0.0。它警告我有关破坏依赖项的信息,我尝试了各种咒语来强制升级或重置我的本地状态,最终使系统陷入困境,以至于我不得不重新安装 ghccabal-install Brew 软件包(这是在 macOS 上)才能获得一切都回到了我可以再次安装和运行的状态。

替代方案:

  • stack install:我已经在使用 Stack 来管理本地开发环境,但它似乎对于独立安装也非常有效,只要您先安装了 Stack。 (只需适当设置您的 $PATH 即可。)
  • 分发预构建的二进制文件:对于最终用户来说会很方便,但至少在 OS X 上,我需要担心代码签名,而且我什至不再为此设置身份。

所以,在我的自述文件中,我现在提到了 stack installcabal install 。但 2016 年的最佳实践是什么?

最佳答案

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

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

stack upload --pvp-bounds=both

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

cabal freeze
mv cabal.config cabal.config-sample

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

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

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

关于haskell - 分发 Haskell 应用程序和更新它的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874974/

相关文章:

haskell - 平行 cabal

haskell - 如何从 HTML 标记中提取内部文本?

haskell - 实例声明中的部分应用类型构造函数

haskell - yesod 测试 - 缺少依赖 yesod-test

haskell - 有没有办法使用特定的沙箱目录运行 IHaskell?

haskell - 使用 FFI 的可执行文件是否需要 GHC 选项?

haskell - 类型类实例检查检测不到 "piecewise instances"

cabal - 在 Ubuntu 14.04 上升级 Cabal

haskell - stack 如何从 extra-deps 中找到包?

haskell - 堆栈 ghci 未加载本地模块?