简短:
我有一个cabal项目依赖于使用cabal sandbox add-source
构建的库。该库导出预处理器函数BuildInfo -> LocalBuildInfo -> PreProcessor
。当我尝试在Setup.hs中使用该预处理器作为我的主要cabal项目时,我收到错误:
Couldn't match type ‘Cabal-1.18.1.3:Distribution.PackageDescription.BuildInfo’
with ‘BuildInfo’
NB: ‘Cabal-1.18.1.3:Distribution.PackageDescription.BuildInfo’
is defined in ‘Distribution.PackageDescription’
in package ‘Cabal-1.18.1.3’
‘BuildInfo’
is defined in ‘Distribution.PackageDescription’
in package ‘Cabal-1.20.0.1’
简短:
我目前在我的cabal沙箱中有以下目录结构:
├── main.cabal
├── Setup.hs
├── Main.hs
├── lib
│ ├── myPP.cabal
│ ├── MyPP.hs
│ └── myPP
│ ├── MyPP.hs
│ ├── myPP.cabal
我的主要包有myPP有一个构建取决于。 myPP是一个库,其中MyPP作为公开的模块,Cabal
和ghc
作为依赖项。 MyPP模块导出一个函数
myPP :: BuildInfo -> LocalBuildInfo -> PreProcessor
然后我跑
cabal sandbox add-source ./lib/*
cabal install myPP
在我的Setup.hs中,我有:
module Main (main) where
import Distribution.Simple
import Distribution.Simple.PreProcess
import Distribution.Simple.Utils
import Distribution.PackageDescription
import Distribution.Simple.LocalBuildInfo
import MyPP(myPP)
main :: IO ()
main = let hooks = simpleUserHooks
pp = ("pp",myPP)
in defaultMainWithHooks hooks {hookedPreProcessors = pp:knownSuffixHandlers}
然后我尝试实际cabal build
只是为了得到错误:
Couldn't match type ‘Cabal-1.18.1.3:Distribution.PackageDescription.BuildInfo’
with ‘BuildInfo’
NB: ‘Cabal-1.18.1.3:Distribution.PackageDescription.BuildInfo’
is defined in ‘Distribution.PackageDescription’
in package ‘Cabal-1.18.1.3’
‘BuildInfo’
is defined in ‘Distribution.PackageDescription’
in package ‘Cabal-1.20.0.1’
尝试诊断错误:
我的理解是,如果您的软件包依赖于ghc
和Cabal
,那么您将获得与ghc
构建时链接的Cabal版本。因此,myPP软件包是使用旧版本的cabal构建的。当cabal运行自定义Setup.hs
时,它会导入其cabal版本(我已安装的版本)。这会导致错误。但是,我希望有一个更好的解决方案,而不仅仅是降级我的Cabal版本....
答案 0 :(得分:0)
你不会喜欢另一个解决方案:从当前的HEAD构建ghc以获得更新的Cabal(现在为1.21.1.0)。不幸的是,没有办法让一个包的两个不同版本在一个版本中共存。降级Cabal可能是最不痛苦的选择。