我了解,如果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行注释掉,这种情况就不会发生。
这是什么原因,有办法避免这种不必要的重新编译吗?
答案 0 :(得分:1)
模板Haskell中有一个名为addDependentFile
的功能,该功能将元数据添加到.hi
文件中,指示有问题的源文件也依赖于另一个文件。据我所知,Cabal会总是要求GHC进行构建,尽管它可能具有更智能的逻辑。 Stack尝试绕过该过程,并具有将addDependentFile
信息解析出来的逻辑。