这是Haskell堆栈软件包依赖项配置问题。
git:LibA
git:LibB
创建了另一个Haskell库git:LibA
AppC
创建了一个Haskell应用程序git:LibB
要编译LibB
,我需要在git:LibA
的{{1}}的{{1}}部分中指定extra-deps
,并附带提交校验和,这是合理的。 / p>
要编译LibB
,似乎我需要在stack.yaml
的{{1}}
AppC
部分中指定以下两个软件包:
extra-deps
,带有提交校验和AppC
,带有提交校验和是否有任何方法只能在stack.yaml
中指定git:LibB
或配置git:LibA
以向应用程序隐藏git:LibB
信息?
问题的动机:我当前的AppC
的{{1}}容易出错:如果我更新了LibB
和git:LibA
中的提交校验和,却忘记了更新AppC
中的校验和,那么我将不会在stack.yaml
中获得新的LibA
。我认为,LibB
的较新校验和应已包含较新的AppC
的信息,并且LibA
的开发人员无需在以下位置更新AppC
的校验和: LibB
,但只有LibA
的校验和。
答案 0 :(得分:1)
否,这是不可能的。根据设计,stack
仅使用您正在构建的项目的stack.yaml
。它不会读取或使用任何依赖项中可能存在的stack.yaml
文件。这种设计的一个优点是可以在一个地方指定软件包的版本。否则,不清楚如何处理请求同一程序包不同版本的不同stack.yaml
。
如果您希望在一起开发这些软件包时获得更多便利,有两种选择,并且不太关心保持它们独立性。您可以在stack.yaml
中指定相对路径,并始终使用本地签出的任何版本进行构建。或者,您可以将所有这三个都放入一个VCS仓库中,并使用VCS管理对A的哪些更改应与对C中的哪个进行链接。
答案 1 :(得分:1)
否,堆栈不会“看到”任何依赖项的stack.yml,只能看到它们各自的.cabal描述符。
如果您要构建多个内部软件包,则可以将它们全部放在同一源代码树下,并在stack.yaml
的软件包列表中列出它们:
packages:
- LibA
- LibB
- AppC
请注意,这并不意味着所有人都可以将它们放入同一个VCS中-您可以使用git子模块;或者,您甚至可以列出git位置/哈希,就像直接使用Extra-deps一样。
如果您的软件包应该完全独立,那当然不是一个选择,但是到那时,您可能希望研究一种更结构化的解决方案,例如无论如何制作custom snapshots。