cabal何时重新编译包含Template Haskell的模块?

时间:2018-11-03 21:37:15

标签: haskell cabal template-haskell

我了解,如果cabal的任何依赖项的接口已更改,它将重新编译模块。如果模块包含Template Haskell,则似乎不适用此简单规则。在那种情况下,即使只是在模块的(传递)依赖项中向文件添加尾随换行符,也会导致阴谋集团重新编译该文件。

最小示例:

文件:Foo.hs

module Foo where
foo = "foo"

文件:FooTH.hs

{-# LANGUAGE TemplateHaskell #-}
module FooTH where
import Data.Bifunctor.TH
import Foo

data FooPair a b = FooPair a b
$(deriveBifunctor ''FooPair)

文件:MCVE.cabal

name:                MCVE
version:             0.1.0.0
synopsis:            MCVE
license:             MIT
license-file:        LICENSE
author:              tarleb
maintainer:          tarleb@example.com
build-type:          Simple
extra-source-files:  CHANGELOG.md
cabal-version:       >=1.10

library
  exposed-modules:     Foo
                     , FooTH
  build-depends:       base >=4.8 && <4.13
                     , bifunctors
  default-language:    Haskell2010

在Foo.hs中添加换行符,例如通过运行echo "\n" >> Foo.hs,将导致模块FooTH的重新编译。如果将FooTH中的TH行注释掉,这种情况就不会发生。

这是什么原因,有办法避免这种不必要的重新编译吗?

1 个答案:

答案 0 :(得分:1)

模板Haskell中有一个名为addDependentFile的功能,该功能将元数据添加到.hi文件中,指示有问题的源文件也依赖于另一个文件。据我所知,Cabal会总是要求GHC进行构建,尽管它可能具有更智能的逻辑。 Stack尝试绕过该过程,并具有将addDependentFile信息解析出来的逻辑。

相关问题