我有一个包含源代码树的项目:
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
之下时,是否有其他解决方法(我希望保留一些源代码分离)?
答案 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文件完全分离不同的模块,从而允许每个模块之间更丰富的依赖关系。