haskell - 如何从 cabal 文件中排除以避免破坏我的包的 GHC 错误?
问题描述
由于我的包不适用于 GHC 9.0.1 中的已知问题,如果我想排除具有导致问题base
的错误的版本(什么;?),我需要在那里指定什么?它与 GHC 的所有其他人一起工作,直到 7 岁。.cabal
解决方案
编辑:正如我发布的那样,我记得还有另一个技巧可以通过将其写入 cabal 文件来排除 GHC 版本:
library
...
-- This package does not work with GHC 9.0.1 due to a bug
-- See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187
if impl(ghc == 9.0.1)
buildable: False
这不会给出描述性很强的错误,但会阻止 GHC 9.0.1 构建您的包。
有一个 Haskell wiki 页面,关于哪些基本版本对应于哪些 GHC 版本:https ://wiki.haskell.org/Base_package 。值得注意的是“ 9.0.1 (Feb 2021) 4.15.0.0
”,因此您可以添加base <4.15.0.0
到您的 cabal 文件以排除 GHC 9.0.1。但这并不是万无一失的方法,因为基础版本并不总是随着 GHC 版本的变化而变化。当错误被修复时,它可能不一定伴随着新base
版本。
我认为没有办法在你的 cabal 文件中明确排除 GHC 版本,但这也是合理的,因为根本不应该使用带有错误的 GHC 版本来编译任何包;用户不应期望 GHC 9.0.1 能够正确编译任何包。我认为库作者可以简单地在文档中的某处警告此特定错误,如果已知它会导致其包中的问题。
另一种选择是在包含错误的模块中使用 CPP 强制编译失败,以检查它是否使用特定 GHC 版本进行编译,如此 stackoverflow 问题中所述,该问题链接到GHC 手册中的此部分。
因此,您可以在文件顶部添加如下内容:
{-# LANGUAGE CPP, TemplateHaskell #-}
#if __GLASGOW_HASKELL__==900 && __GLASGOW_HASKELL_PATCHLEVEL1__==1
$(error "This library does not work with GHC 9.0.1 due to a bug\n\
\ See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187.")
#endif
这至少会阻止任何人使用 GHC 9.0.1 构建该模块,并且会给出一个合理可读的错误消息:
CPPTest.hs:1:1: error:
Exception when trying to run compile-time code:
This library does not work with GHC 9.0.1 due to a bug
See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187
CallStack (from HasCallStack):
error, called at CPPTest.hs:4:1 in main:Main
Code: error
"This library does not work with GHC 9.0.1 due to a bug\n See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187"
|
1 | {-# LANGUAGE CPP, TemplateHaskell #-}
| ^
推荐阅读
- python - Python:需要高精度整数的解决方案(生成素数)
- javascript - 如何判断图像是否未在 Angular 中加载?
- json - 使用 JSON 和 TypeScript 进行静态类型化
- java - 返回类型与其所属名称相同的接口类型方法的用例场景是什么?
- c# - 在 .NET 中同步本地网络 NAS 上的文件
- javascript - 如何在 Firebase 快照中返回数据
- java - Pivotal Cloud Foundry - 连接被拒绝
- excel - Excel - 使用标准计算数字字符串的出现次数
- python - SKLearn 使用新数据进行预测
- java - Java:声纳强制构造函数