如何避免在cabal文件中重新编译?

23
我在做一个Haskell项目,有一个cabal文件。现在,我的项目被构建成一个实现简单解释器的库,还有一个很短的Main文件需要构建成可执行文件以调用库。我想要做到的是:
1)编译库并公开一些模块
2)编译可执行文件
我有一个能够工作并似乎实现了这个功能的cabal文件。问题是,在它编译可执行文件时,它会重新编译已经在步骤(1)中编译过的所有模块。我不太明白为什么会这样 - 除了创建两个单独的cabal文件之外,是否有任何停止这种情况的方法?
因为cabal不喜欢在同一个目录下放置两个cabal文件,并且我不想为第二步设置单独的项目目录,因为这基本上只相当于编译单个文件。
cabal-version:      >= 1.6
build-type:         Simple
name:               HaSC
version:            0.2.3
license:            OtherLicense
category:           Language
author:             Chris B
maintainer:         Chris B
copyright:          Chris B 2010 - 2011
synopsis:           (HA)skell (S)ound (C)hange applier (HaSC) library
description:        HaSC implements a little language for applying sound changes to words
homepage:           http://www.chrisdb.me.uk/redmine/projects/haskell-sound-change
stability:          Alpha
data-files:         doc/HaSCDoc.pdf
license-file:       LICENSE

library
    build-depends:
        base >= 4.3,
        containers >= 0.3,
        parsec >= 3,
        parallel >= 3.1,
        deepseq >= 1.1,
        mtl >= 1.1, 
        transformers >= 0.2,
        text >= 0.10,
        text-icu >= 0.6.3,
        pretty >= 1,
        directory >= 1.1,
        filepath >= 1.2
    hs-source-dirs:  src
    exposed-modules: HaSC.IO.Disk,
                     HaSC.IO.Memory,
                     HaSC.Exec
    other-modules:   HaSC.AST,
                     HaSC.IO,
                     HaSC.IdentMap,
                     HaSC.Parse,
                     HaSC.Regex,
                     HaSC.Representation,                     
                     HaSC.Transformations,
                     HaSC.Search,
                     HaSC.State

executable HaSC
    GHC-Options: -rtsopts
    hs-source-dirs:  src
    main-is:         Main.hs    
1个回答

24
在你的可执行部分中,将库添加到Build-Depends中,以便可执行文件依赖于该库。
不过有一个小问题:你还需要将可执行文件的Main.hs(以及其他特定于可执行文件的源文件)移动到不同的子目录,并指定不同的Hs-Source-Dirs,以避免它通过位于相同文件夹中而拾取库模块。
executable HaSC
    Build-Depends: HaSC
    Main-Is: Main.hs
    Hs-Source-Dirs: foo -- Directory you moved Main.hs to

为了使这个工作正常,您需要指定 Cabal-Version >= 1.8。有关详细信息,请参见Cabal ticket #89


啊,这就是如何让可执行文件依赖同一个cabal文件中的库。 - nh2
我希望我可以对这个答案进行多次点赞。关键是“陷阱”,它曾经让我崩溃。谢谢。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接