在cabal项目中允许模块源层次结构的灵活性

时间:2016-05-28 13:33:50

标签: haskell build module hierarchy cabal

我有一个包含源代码树的项目:

src/
src/A/
src/A/A.hs
src/B/
src/B/C/
src/B/C/C.hs
...

两个haskell文件将源代码分成以下模块:

-- File A/A.hs
module A where
...

-- File B/C/C.hs
module B.C where
...

cabal文件包含:

other-modules: A, B.C, ...
hs-source-dirs: src/, src/A/, src/B/, src/B/C/, ...

虽然可以轻松找到模块A,但cabal抱怨B.C

cabal: can't find source for B/C in ...

我认为没有合理的解释为什么在A下放置文件定义模块A/A.hs是正常的,但在B.C下放置B/C/C.hs不是。除了将C.hs直接放在B之下时,是否有其他解决方法(我希望保留一些源代码分离)?

1 个答案:

答案 0 :(得分:2)

错误的原因是模块B.C应该在文件B/C.hs中定义,而不是B/C/C.hs(即模块B.C.C)。如果您只有一个源目录和一个源文件,则会出现此错误,这不是因为您添加了额外的部分。

此外,hs-source-dirs指令中出现的目录应该只是目录树的根目录,因此您需要放入所有部分,这是值得怀疑的,例如{{1} }(将src/B/C视为另一个根....这意味着您可以在该目录中定义顶级模块。如果您实际上是这样做,我会认为这是一个错误。)

您可能想要做的是定义多个顶级源目录,例如

src/B/C

更好的是,我建议您使用stack,它允许您使用自己的源目录(称为A_src/A.hs B_src/B/C.hs hs-source-dirs: A_src, B_src )和独立的.cabal文件完全分离不同的模块,从而允许每个模块之间更丰富的依赖关系。