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

问题描述

由于我的包不适用于 GHC 9.0.1 中的已知问题,如果我想排除具有导致问题base的错误的版本(什么;?),我需要在那里指定什么?它与 GHC 的所有其他人一起工作,直到 7 岁。.cabal

标签: haskellcabalhaskell-stack

解决方案


编辑:正如我发布的那样,我记得还有另一个技巧可以通过将其写入 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 #-}
  | ^

推荐阅读