如何在我的 cabal 包中指定 "internal" 个模块

How can I designate "internal" modules in my cabal package

我正在使用 cabal 来帮助组织我的依赖项、构建过程以及测试我正在处理的一个小型 Haskell 项目。当前的 cabal 文件包含如下行:

library
  hs-source-dirs:      src
  exposed-modules:     Project.Exposed1
                       , Project.Exposed2
                         -- pretty please don't use below modules
                       , TestingUtilityFunctions
                       , GenericUtilityFunctions

  other-modules:       Convenient submodule for responsibility separation
                       , Another one

executable E1
  -- relies on Project for both Project.Exposed1 AND GenericUtilityFunctions

testsuite T2
  -- relies on Project for both Project.Exposed2 AND TestingUtilityFunctions

我需要保持 TestingUtilityFunctionsGenericUtilityFunctions 暴露,因为它们出现在 E1T2 中。但是,它们不应该出现在库中,因为库的功能不是提供通用实用函数(我会根据需要进行更改),而是提供由 Project.Exposed* 模块公开的接口。

有什么方法可以制作一个 "private" 库(或多个,以最大限度地减少依赖过度包含),我可以在我的包中使用它,但可以跨可执行文件和测试套件使用?

containers 中使用的一种方法是使用 CPP 有条件地公开一些绑定,具体取决于是否正在 运行。

在大多数情况下,正确的做法是公开您的内部模块,名称类似于Blah.Blah.Internal,这样您的用户就可以在背后玩游戏,同时郑重地(但含蓄地)警告他们,他们最好小心,他们不能依赖其中的任何内容,在不同版本之间保持相同。