首页 文章

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

提问于
浏览
1

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作为公开的模块, Cabalghc 作为依赖项 . 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:

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

1 回答

  • 0

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

相关问题