Haskell 我如何指定;“内部”;我的阴谋集团包中的模块

Haskell 我如何指定;“内部”;我的阴谋集团包中的模块,haskell,cabal,Haskell,Cabal,我正在使用cabal来帮助组织我的依赖关系,构建过程,并为我正在从事的一个小Haskell项目进行测试。当前cabal文件包含以下行: library hs-source-dirs: src exposed-modules: Project.Exposed1 , Project.Exposed2 -- pretty please don't use below modules

我正在使用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
我需要保持
TestingUtilityFunctions
GenericUtilityFunctions
公开,因为它们出现在
E1
T2
中。但是,它们不应该出现在库中,因为库的功能不是提供通用的实用程序功能(我会根据自己的需要进行更改),而是提供由
Project.exposed*
模块公开的接口


有没有办法创建一个“私有”库(或几个,以最小化对包含的依赖),我可以在包内使用它,但可以跨可执行文件和测试套件使用它?

容器中使用的一种方法是使用CPP有条件地公开一些绑定,这取决于是否正在运行测试构建


在大多数情况下,正确的方法是公开您的内部模块,其名称类似于
Blah.Blah.Internal
,允许您的用户在您背后庄重(但含蓄)地玩游戏警告他们,他们最好小心,不能依赖其中的任何东西在不同版本之间保持不变。

考虑到项目的范围,似乎使用内部模块可能是可行的,特别是因为我没有其他令人信服的理由使用CPP。不幸的是,这并不能解决过度包含依赖项的问题。
GenericUtilityFunctions
TestingUtilityFunctions
来自库是否重要?我的意思是,你可以想象用自己的库的内部副本构建你的可执行文件和测试套件,而不是对库有实际的依赖;这将显著增加编译时间,但会减少公开内部内容的需要。如果这是测试套件所需要的,我可能不会太在意,尽管即使是您的可执行文件也需要访问内部内容,这可能是一个坏迹象,表明您的公共API不够令人兴奋。(…如果这种方法听起来很吸引您,我很乐意将它写得足够详细,作为一个答案。)@DanielWagner这个答案看起来像是解决了我在问题中要求的所有问题,但不幸的是编译时间是一个非常严重的问题,主要是因为测试依赖性,这需要一段时间。我认为这是一个值得发布的答案,因为它解决了问题想要什么。@DanielWagner它实际上有点复杂-我同意如果可执行文件需要访问内部,这是一个API问题。实际情况如下:库提供了通用功能X。可执行文件提供了X,Y的一个重要实例。Y包含一些枯燥的业务逻辑,这些逻辑不太复杂,但需要相当多的代码——它很容易测试,并且可以从单元测试中获得很多好处。如果我想测试Y,我需要在库中包含Y,以便可以对其进行测试……听起来您只需要在可执行文件和测试套件之间共享一个模块,而该模块不需要访问库内部。对我来说,这叫“不是库的一部分”——只是一个文件,您只需编写一次,然后在可执行文件和测试套件中导入。该模块将需要编译两次,但这可能不是一个很大的成功——肯定比三次编译库要小。