【问题标题】:How to handle feature requests that add new package dependencies如何处理添加新包依赖项的功能请求
【发布时间】:2011-09-15 20:15:01
【问题描述】:

我是一个关于 hackage 的包的维护者,lrucache。我最近收到了一个为BinaryNFData 添加实例的功能请求。这两个都是有用的东西,原则上我对这些实例没有问题。

但是,它们都引入了新的包依赖项,我希望尽可能减少包的依赖项列表。有没有理智的方法来处理这个?可能有超过 20 个不同的包提供了有用的类型类,lrucache 中的数据结构可以实现这些类并从中受益。

显然,将它们全部添加为依赖项是行不通的。但是还能做什么呢?

我可以向 lrucache.cabal 添加标志,以便编译各种实例。就使依赖项列表最小化而言,这很有效,除非您需要它。但这在现实世界中很可怕,因为您不能在 build-depends 部分中指定构建标志。因此,您可以依赖具有特定标志的包,但不指定该依赖项。这很快就会变得几乎无用。

我可以创建一堆孤立的实例包。这样做的好处是允许在 build-depends 部分中指定对这些实例的依赖关系。它的主要缺点是在 hackage 中添加了大量额外的包,并且需要将它们作为单独的包进行维护。

我还能做什么?什么是正确的做法?

【问题讨论】:

  • “孤立实例包”方法似乎是一种常见的策略,至少。正确的做法可能是发明更好的依赖管理,但是......
  • @C. A. McCann,我个人不喜欢软件使用./configure --enable-Z。我喜欢简单的东西——标记为已安装的包意味着它已安装,而不是“它安装了选项 X 和 Y 但不是 Z”。也许 Hackage 可以更好地组织孤立实例包,但我不认为它们在概念上是非法的。
  • @gatoatigrado:我同意。正如我提到的,Cabal 更好地组织它们也可以称为“更好的依赖管理”,所以请随意发明它。 :] 我不确定实施这样的系统会遇到什么障碍。
  • stackoverflow.com/questions/7043442/… 之类的可能重复?
  • nfdata 可以在主包中拥有实例——它已经依赖于许多核心包。 binary 曾经是唯一的序列化包,但现在有一些竞争对手。为此,一个单独的包可能没问题,但如果序列化代码足够简单,您可以在 docs/wiki 页面中提供它,并让用户在必要时编写自己的实例或序列化代码。

标签: haskell cabal hackage


【解决方案1】:

cabal(包装系统)本身缺少可选的依赖系统,选项不太好。

一个选项如下。您可以为您可能希望主包集成的每个附加包创建自己的附加包。

例如,如果您希望 lrucachebinary 集成,您可以创建一个包含集成的附加包 lrucache-binary(在这种情况下,键入类实例)。同样,您自己的新包lrucache-nfdatalrucachenfdata 集成。

如果有人想要lrucache 及其与binary 的集成,他可以同时依赖[binary, lrucache, lrucache-binary]

【讨论】:

  • 我认为这正是我提到的“孤立实例包”的意思。
【解决方案2】:

如果你只维护两个包怎么办:lrucache,这取决于无数不同的东西,然后lrucache-lite(或lrucache-minimal)或多或少是你现在拥有的。然后,如果人们想要最小化他们的依赖关系,他们会使用精简版,如果他们不关心有无数的依赖关系,他们会使用标准版本。大的可能会依赖精简的,以避免代码重复。

【讨论】:

  • 我已经看到这个名称为 lrucachelrucache-instances。这样只有两个包,但无法选择实例。
【解决方案3】:

游戏有点晚了,但我的两分钱:

  1. 库的公共 API(包括类实例)永远不应根据构建标志或包可用性而更改 - 它会惩罚下游开发人员和发行包维护者。

  2. 我将毫无疑问地向 Haskell 平台中的任何内容添加依赖项(可能除了“unix”或“win32”等)。

这仍然是“二进制”,但是根据其 Hackage 页面,它可以在多个 Linux 发行版中使用,并且根据我的经验,它可以在 Windows 上干净地安装。在这种情况下,我会接受补丁,但不会自己编写。

这并不能真正直接回答问题,但希望能说明我将使用的思考过程。

【讨论】:

    【解决方案4】:

    我可以向 lrucache.cabal 添加标志,以便编译各种 实例。就使依赖项列表最小化而言,这是有效的, 除非你想要它。但这在现实世界中很可怕,因为 您不能在 build-depends 部分中指定构建标志。这样你就可以 依赖于具有特定标志的包,但未指定 依赖。这很快就会变得几乎无用。

    这可能正是您所说的不适用于上面的内容,但是您可以在conditionally-compiled CPP 编译指示中包含您的导入和类定义吗?我想包裹在imports 的内部模块中,这些模块又会导入您的“可选依赖项”之一。

    我还没有尝试过,但我也很想知道答案。

    【讨论】:

    • 是的,这行得通。但是可以说我是这样做的,例如,对于 Binary 实例。假设您正在编写一个使用 lrucache 的程序,并希望使用 Binary 实例对其进行序列化。没有办法在您的 cabal 文件的 build-depends 部分中指出这一点。这就是这种方法的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2012-12-28
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多