分发 Haskell 应用程序并更新它的最佳实践
Best practices for distributing a Haskell application and updating it
tl;博士
大约一周前,我为我的第一个重要 Haskell 项目发布了 0.1.0.0 包。我希望可执行文件易于安装和升级,即使对于非 Haskell 用户也是如此。在 the README 中,我建议使用 cabal install
安装。这是一个错误吗?
上下文
我听说过 "Cabal hell",但没有意识到用户升级包的全局安装副本会有多么困难,即使我保守地实际上没有更改任何版本依赖项.cabal
文件。最后,我陷入了一个深坑,试图从 0.1.0.0 更新到 0.2.0.0。它警告我要打破依赖关系,我尝试了各种咒语来强制升级或重置我的本地状态,结果使系统变得非常乏味,以至于我不得不重新安装 ghc
和 cabal-install
Brew 软件包(这在 macOS) 上,以便让一切恢复到我可以再次安装和 运行 的状态。
备选方案:
stack install
:我已经在使用 Stack 来管理本地开发环境,但它似乎也适用于独立安装,只要您首先安装了 Stack。 (只需要适当地设置您的 $PATH
。)
- 分发预构建的二进制文件:对最终用户来说会很好也很容易,但至少在 OS X 上,我需要担心代码签名,而且我什至没有设置身份就这样了。
所以,现在在我的 README 中我提到了 stack install
和 cabal 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-
。据说他们永远不会被删除。在另一
一方面,您将通过减少快照数量来帮助您的用户
他们必须维护的目录。
tl;博士
大约一周前,我为我的第一个重要 Haskell 项目发布了 0.1.0.0 包。我希望可执行文件易于安装和升级,即使对于非 Haskell 用户也是如此。在 the README 中,我建议使用 cabal install
安装。这是一个错误吗?
上下文
我听说过 "Cabal hell",但没有意识到用户升级包的全局安装副本会有多么困难,即使我保守地实际上没有更改任何版本依赖项.cabal
文件。最后,我陷入了一个深坑,试图从 0.1.0.0 更新到 0.2.0.0。它警告我要打破依赖关系,我尝试了各种咒语来强制升级或重置我的本地状态,结果使系统变得非常乏味,以至于我不得不重新安装 ghc
和 cabal-install
Brew 软件包(这在 macOS) 上,以便让一切恢复到我可以再次安装和 运行 的状态。
备选方案:
stack install
:我已经在使用 Stack 来管理本地开发环境,但它似乎也适用于独立安装,只要您首先安装了 Stack。 (只需要适当地设置您的$PATH
。)- 分发预构建的二进制文件:对最终用户来说会很好也很容易,但至少在 OS X 上,我需要担心代码签名,而且我什至没有设置身份就这样了。
所以,现在在我的 README 中我提到了 stack install
和 cabal 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-
。据说他们永远不会被删除。在另一
一方面,您将通过减少快照数量来帮助您的用户
他们必须维护的目录。