如何在阴谋集团项目中组织公共和私人图书馆?

问题描述 投票:0回答:1

我有一个包含多个模块的项目,

  • 2 用于导出公共库(各 1 个,例如
    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

最后一位的重复非常丑陋。

haskell cabal
1个回答
0
投票

如果您希望模块

import A.Internal.D.D
import A.Internal.E.E
成为其自己的库,同时位于模块层次结构中的
D
下,则可以在
A
下有一个
A
目录:

D
© www.soinside.com 2019 - 2024. All rights reserved.