我有一个包含多个模块的项目,
A
和 B
;两者中,B
是一种后端,由 A
使用,但我正在导出两者)因为我认为可以将 B
用于另一个不同的项目);(还有一个带有
module
的非 main :: IO ()
文件对应于 executable
节,但实际上在某些时候我会删除它以进行测试,因为我真正使用它的目的是检查 B
导出的实体是否符合我的预期。)
如果我愿意的话
library
,build-depends
,即只有各自文件中的 import
所暗示的那些,.
分隔的字符串中不存在重复字符串,import Foo.Bar.Baz
,在目录组织方面我有哪些选项?
最初每个模块都有
library
文件中自己的 .cabal
节,build-depends
列表,但随后我开始尝试项目的层次结构,以及对依赖项和要使用的
import
语法的影响。
目前我的项目树结构如下:
.
|
+--- lib/
| |
| +--- A/
| | |
| | +--- A.hs
| | |
| | +--- Internal/
| | |
| | +--- E.hs
| +--- B/
| | |
| | +--- B.hs
| |
| +--- C/
| | |
| | +--- C.hs
| |
| +--- D/
| | |
| | +--- D.hs
|
+--- exe/
| |
| +--- Main.hs
|
+--- myproject.cabal
我将
E.hs
放入 A/Internal
正是为了进行实验。
让我解释一下。
E.hs
确实是A.hs
的实现细节,因此在某种程度上,它位于名为Internal
的目录中的somewhere确实有意义。很高兴我可以通过
import
模块
import A.Internal.E
和 A
可以通过 导入
B
这是有道理的,因为这些模块是导出的。
现在说
import A
import B
是C
的实现细节。我会把它放在那里:
B
到目前为止,每个模块仍在其目录中,因此它们可以各自拥有自己的
.
|
+--- lib/
| |
| +--- A/
| | |
| | +--- A.hs
| | |
| | +--- Internal/
| | |
| | +--- E.hs
| +--- B/
| | |
| | +--- B.hs
| | |
| | +--- Internal/
| | |
| | +--- C.hs
| +--- D/
| |
| +--- D.hs
|
+--- exe/
| |
| +--- Main.hs
|
+--- myproject.cabal
。
但是一旦我决定,比如说,
build-depends
也是D
的实现细节,我就会遇到这个,
A
其中
.
|
+--- lib/
| |
| +--- A/
| | |
| | +--- A.hs
| | |
| | +--- Internal/
| | |
| | +--- E.hs
| | |
| | +--- D.hs
...
和 E.hs
位于同一目录中,因此,如果我理解正确,则无法导出 2 个不同的库,每个库都有其 D.hs
。
我绝对可以添加另一个目录层,
build-depends
但这意味着我需要写
.
|
+--- lib/
| |
| +--- A/
| | |
| | +--- A.hs
| | |
| | +--- Internal/
| | |
| | +--- E.hs
| | |
| | +--- E/
| | | |
| | | +--- E.hs
| | |
| | +--- D.hs
| | |
| | +--- D/
| | |
| | +--- D.hs
...
import
和E
D
最后一位的重复非常丑陋。
如果您希望模块
import A.Internal.D.D
import A.Internal.E.E
成为其自己的库,同时位于模块层次结构中的 D
下,则可以在 A
下有一个 A
目录:
D