如何在我的cabal包中指定“内部”模块

时间:2015-09-11 20:07:59

标签: haskell cabal

我正在使用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*模块公开的接口。

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

1 个答案:

答案 0 :(得分:10)

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

在大多数情况下,正确的做法是公开您的内部模块,其名称为Blah.Blah.Internal,让您的用户可以在庄严地(但含蓄地)背后玩游戏警告他们他们最好小心,并且他们不能依赖从版本到版本保持相同的任何东西。