将 deps 信息隐藏在 extra-deps 链中
hide deps info in a chain of extra-deps
这是一道Haskell堆栈包依赖配置问题。
- 我创建了一个 Haskell 库
git:LibA
- 我根据
git:LibA
创建了另一个 Haskell 库 git:LibB
- 我根据
git:LibB
创建了一个 Haskell 应用程序 AppC
要编译 LibB
,我需要在 LibB
的 stack.yaml
的 extra-deps
部分指定 git:LibA
和提交校验和,这是合理的.
要编译 AppC
,我似乎需要在 AppC
的 stack.yaml
的 extra-deps
部分中指定以下两个包
git:LibB
带有提交校验和
git:LibA
提交校验和
有什么方法可以只在 AppC
中指定 git:LibB
或配置 LibB
以向应用程序隐藏 git:LibA
信息吗?
问题的动机:我当前的AppC
的stack.yaml
容易出错:如果我更新LibA
和LibB
中的提交校验和但忘记了更新 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 无论如何。
这是一道Haskell堆栈包依赖配置问题。
- 我创建了一个 Haskell 库
git:LibA
- 我根据
git:LibA
创建了另一个 Haskell 库 - 我根据
git:LibB
创建了一个 Haskell 应用程序
git:LibB
AppC
要编译 LibB
,我需要在 LibB
的 stack.yaml
的 extra-deps
部分指定 git:LibA
和提交校验和,这是合理的.
要编译 AppC
,我似乎需要在 AppC
的 stack.yaml
extra-deps
部分中指定以下两个包
git:LibB
带有提交校验和git:LibA
提交校验和
有什么方法可以只在 AppC
中指定 git:LibB
或配置 LibB
以向应用程序隐藏 git:LibA
信息吗?
问题的动机:我当前的AppC
的stack.yaml
容易出错:如果我更新LibA
和LibB
中的提交校验和但忘记了更新 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 无论如何。