Cabal项目似乎正在导入破坏Setup.hs的多个版本的Cabal Library

时间:2014-09-01 00:30:45

标签: haskell cabal

简短:

我有一个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作为公开的模块,Cabalghc作为依赖项。 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’

尝试诊断错误:

我的理解是,如果您的软件包依赖于ghcCabal,那么您将获得与ghc构建时链接的Cabal版本。因此,myPP软件包是使用旧版本的cabal构建的。当cabal运行自定义Setup.hs时,它会导入其cabal版本(我已安装的版本)。这会导致错误。但是,我希望有一个更好的解决方案,而不仅仅是降级我的Cabal版本....

1 个答案:

答案 0 :(得分:0)

你不会喜欢另一个解决方案:从当前的HEAD构建ghc以获得更新的Cabal(现在为1.21.1.0)。不幸的是,没有办法让一个包的两个不同版本在一个版本中共存。降级Cabal可能是最不痛苦的选择。