【问题标题】:Flexibility of the hierarchy of module sources allowed in cabal projectcabal 项目中允许的模块源层次结构的灵活性
【发布时间】:2016-05-28 13:33:50
【问题描述】:

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

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 模块很容易找到,但阴谋集团抱怨B.C

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

我没有看到任何合理的解释,为什么将文件定义模块 A 放在 A/A.hs 下是可以的,但将 B.C 放在 B/C/C.hs 下是不行的。除了将C.hs 直接放在B 下(我想保持一些来源分离)之外,还有其他解决方法吗?

【问题讨论】:

  • 通常你只在hs-source-dirs中列出像src/这样的顶级目录,然后你必须重命名模块A => A.A和模块B.C => B.C.C,模块A也必须放在src/A.hs 中,例如aeson 作为有效模块结构的示例。我认为的错误是因为它在目录 B/C/ 中查找文件夹 B,然后在其中查找不存在的源文件 C.hs
  • 对于模块 X.Y.Z,GHC 在 hs-source-dirs 中查找文件 X/Y/Z.hs。

标签: haskell build module hierarchy cabal


【解决方案1】:

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

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

你可能想要做的是定义多个顶级源目录,像这样

A_src/A.hs
B_src/B/C.hs

hs-source-dirs: A_src, B_src

更好的是,我建议您使用堆栈,它允许您使用自己的源目录(称为src)和独立的 .cabal 文件将不同的模块完全分开,从而使每个模块之间的依赖关系更加丰富。

【讨论】:

  • 我不确定我是否准备好使用stack。当将A 中的一部分源代码与其余代码分离,然后将其拆分为主要部分和一些子部分以将主要部分放在A/ 中,而将子部分放在A/A/ 中时,感觉完全不自然。我真的希望有一个自包含在一个目录中的模块。分裂成更多的树不是我要找的,逻辑分离不是那么严格。
  • 从您的评论看来,您真正想做的只是将模块放在源代码树的不同位置。为此,不要碰运气 hs-source-dirs(只使用 src 单独),然后将模块放在每个子目录中,并将它们命名为 <path>.<name>(即创建 B/C.hs,然后将其命名为 @987654336 @)。当你创建一个源目录时,它里面的所有东西都会被考虑编译。
  • 嗯,我想要的和我认为有意义的:模块对应于目录(不是路径/文件名.hs)。但我已经采用了你描述的方式。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2023-02-14
  • 1970-01-01
相关资源
最近更新 更多