如何确定是将Haskell库作为一个包还是多个包发布?

Gre*_*ite 5 haskell packaging

有时,项目可以组织为单个包或多个包.当一个人处于这种情况时,应该如何决定哪个选项更好?

Tox*_*ris 10

在多个包上分发项目有一些直接的缺点:

  • 构建过程比仅仅更复杂 cabal build
  • 必须协调版本和版本号
  • 用户必须安装并依赖多个包
  • API文档分散在hackage上

但是,对于仅依赖于包的子集的用户而言,也有潜在的好处:

  • 他们不必在他们不需要的软件包中下载,编译,链接,安装,信任和许可代码
  • 他们不必下载,...,以及他们不需要的软件包的许可依赖性
  • 如果他们的名称和元数据特定于单个包,而不是整个项目,他们可以更容易地发现包

即使用户最终取决于所有包,也有一些好处:

  • 不同的包可以有不同的维护者和/或发布时间表

我认为决定应该基于您是否认为有用户能够真正实现潜在的利益.所以我想说决定主要取决于以下问题的答案:

  • 是否项目的一部分比其他部分更改频繁?
  • 项目的一部分是否比其他部分更受信赖?
    (例如,核心包和contrib包)
  • 是否有项目的一部分具有许多其他依赖项,但并非所有用户都需要?
    (例如,另一个项目的接口)
  • 项目的一部分是否可以独立于整个项目的目的重复使用?
    (例如,主项目中使用的组合器库)
  • 是否有项目的一部分强制用户使用特定许可证(直接或通过依赖项),但并非所有用户都需要?

最后,对于cabal,"one package"和"many packages"之间存在中间地带,因为一个cabal包可以包含一个库和任意数量的可执行文件,测试套件和基准.这涵盖了导致拆分包的一个重要原因:用户不必仅依赖测试库来使用该包.