微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 cabal 文件中排除以避免破坏我的包的 GHC 错误?

如何解决如何从 cabal 文件中排除以避免破坏我的包的 GHC 错误?

my package will not work with a known issue in GHC 9.0.1 开始,如果我想从我的 base 中排除具有 bug that causes the issue 的版本(什么;.cabal?),我需要在那里指定什么?它与 GHC 的每个其他人一起工作,直到 7 点多。

解决方法

编辑:就在我发布这篇文章时,我记得还有一个技巧可以通过将其写入 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 版本编译,如 this stackoverflow question 中所述,链接到 this section in the GHC manual

所以你可以在你的文件顶部添加这样的内容:

{-# 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 #-}
  | ^

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。