cabal,模块和依赖

时间:2014-07-07 13:19:26

标签: haskell cabal

我想知道,当您通过cabal下载并安装软件包时,cabal会尝试构建所有内容或仅构建您需要的内容。 例如很多包include和HaskellTemplate模块,它显然需要HaskellTemplate扩展。如果您使用不支持此扩展但不关心此模块的编译器会发生什么事情,因为您还没有使用它?

1 个答案:

答案 0 :(得分:0)

当你从hackage cabal install打包时,cabal也需要安装该软件包的所有依赖项。

通常,程序包中的所有文件都会被编译。但是,有一些例外:

  1. Cabal默认情况下不会构建测试套件或基准测试。
  2. 如果包有标志,如果设置/取消设置了某些标志,则可能会禁用某些模块。可以存在由标志保护的依赖项,如果无法满足启用标志的依赖项,cabal将自动尝试禁用/启用该标志。
  3. 为了说明第2点,请考虑以下包装定义:

    name: foo
    version: 0.1
    
    flag withGHC
      default: True
      manual: False # Allow cabal to figure out the correct value for the flag automatically   
    
    library
      exposed-modules:
        Foo.Bar # This will always be compiled
      if flag(withGHC)
        build-depends: ghc
        exposed-modules:
          Foo.GHC  # This will only be compiled when withGHC is True
    

    现在,当您在GHC下安装foo时,即使启用了标记,cabal也会发现它可以使依赖项饱和,因此将构建Foo.GHC

    但是如果你尝试用另一个编译器安装foo,cabal会在选择withGHC = True时看到这导致依赖ghc,它无法满足。因此,它将选择withGHC = False,并且不会构建Foo.GHC