Short:
我有一个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’
Less Short:
我目前在我的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.h中,我有:
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’
Attempt to diagnose the error:
我的理解是,当你有一个依赖于 ghc
和 Cabal
的包时,你得到的是在 Build ghc
时链接到的Cabal版本 . 因此,myPP软件包是使用旧版本的cabal构建的 . 当cabal运行自定义 Setup.hs
时,它会导入其cabal版本(我已经安装了它) . 这会导致错误 . 但是,我希望有一个更好的解决方案,而不仅仅是降级我的Cabal版本....
1 回答
你不会喜欢另一个解决方案:从当前的HEAD构建ghc以获得更新的Cabal(现在为1.21.1.0) . 不幸的是,没有办法让一个包的两个不同版本在一个版本中共存 . 降级Cabal可能是最不痛苦的选择 .