我如何从阴谋集团文件中排除,以避免GHC错误破坏我的包



由于我的包无法处理GHC 9.0.1中的已知问题,如果我想从我的.cabal中排除存在导致该问题的错误的版本(什么;base?(,我需要在那里指定什么?它与GHC的其他人一起工作,直到7岁左右。

编辑:就在我发布这篇文章的时候,我记得还有另一个技巧可以通过在阴谋集团文件中写这篇文章来排除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

这不会给出一个非常描述性的错误,但它会阻止GHC9.0.1构建您的包。


有一个Haskell wiki页面,介绍哪些基本版本对应哪些GHC版本:https://wiki.haskell.org/Base_package.值得注意的是;CCD_ 3";,因此您可以将base <4.15.0.0添加到您的cabal文件中以排除GHC9.0.1。但这并不是一个万无一失的方法,因为当GHC版本发生变化时,基本版本并不总是会发生变化。修复错误后,可能不一定会附带新的base版本。

我不认为有一种方法可以在你的阴谋集团文件中明确排除GHC版本,但这也是合理的,因为GHC版本中有错误,根本不应该用来编译任何包;用户不应该期望GHC9.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 bugn
      See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187.")
#endif

这将至少阻止任何人使用GHC9.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 bugn      See: https://github.com/orome/crypto-enigma-hs/issues/35#issuecomment-865260187"
|
1 | {-# LANGUAGE CPP, TemplateHaskell #-}
| ^

最新更新