我一直在研究这个Haskell项目,我有一个cabal文件。现在,我的项目被构建为一个实现简单解释器的库。我还有一个非常短的主文件,需要构建成可执行文件来调用库。我想做的是:
1)编译库并公开一些模块
2)编译可执行文件
我有一个可用的cabal文件,似乎就是这样做的。问题是当它编译可执行文件时,重新编译已在步骤(1)中编译的所有模块。我不太明白它为什么这样做 - 有没有办法阻止它,没有创建两个单独的cabal文件?
我真的不想创建两个单独的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
答案 0 :(得分:22)
在您的可执行文件部分中,在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。