将 deps 信息隐藏在 extra-deps 链中

hide deps info in a chain of extra-deps

这是一道Haskell堆栈包依赖配置问题。

  1. 我创建了一个 Haskell 库 git:LibA
  2. 我根据 git:LibA
  3. 创建了另一个 Haskell 库 git:LibB
  4. 我根据 git:LibB
  5. 创建了一个 Haskell 应用程序 AppC

要编译 LibB,我需要在 LibBstack.yamlextra-deps 部分指定 git:LibA 和提交校验和,这是合理的.

要编译 AppC,我似乎需要在 AppCstack.yaml

extra-deps 部分中指定以下两个包

有什么方法可以只在 AppC 中指定 git:LibB 或配置 LibB 以向应用程序隐藏 git:LibA 信息吗?

问题的动机:我当前的AppCstack.yaml容易出错:如果我更新LibALibB中的提交校验和但忘记了更新 AppC 中的校验和,那么我将不会在 AppC 中得到新的 LibA。在我看来,较新的LibB的校验和应该已经包含了较新的LibA的信息,AppC的开发者应该不需要更新LibA的校验和AppC 但只有 LibB 的校验和。

不,这是不可能的。根据设计,stack 仅使用您正在构建的项目的 stack.yaml。它不会读取或使用任何可能存在于您的任何依赖项中的 stack.yaml 文件。这种设计的一个优点是可以在一个地方指定包版本。否则不清楚如何处理不同的 stack.yaml 请求同一包的不同版本。

如果您希望在一起开发这些包时更方便,并且不太关心保持它们的独立性,那么有几个选项。您可以在 stack.yaml 中指定相对路径,并始终使用您在本地签出的任何版本进行构建。或者您可以将所有这三个都放入一个 VCS 存储库中,并使用 VCS 来管理对 A 的哪些更改应该链接到 C 中的哪些更改。

不,stack 没有 "see" 任何依赖项的 stack.yml,只有它们各自的 .cabal 描述符。

如果您正在构建多个内部包,您可以将它们全部放在同一个源代码树下,并将它们列在 stack.yaml:

的包列表下
packages:
- LibA
- LibB
- AppC

请注意,这并不意味着如果您不想,就必须将它们全部放入同一个 VCS - 您可以使用 git 子模块;或者您甚至可以像直接使用 extra-deps 一样列出 git locations/hashes。

如果你的包应该是完全独立的,那当然不是一个选择,但到那时你可能想要研究一个更结构化的解决方案,比如制作 custom snapshots 无论如何。