将部门信息隐藏在一连串的超深度

时间:2018-07-05 15:07:40

标签: haskell dependencies cabal haskell-stack

这是Haskell堆栈软件包依赖项配置问题。

  1. 我创建了一个Haskell库git:LibA
  2. 我根据git:LibB创建了另一个Haskell库git:LibA
  3. 我根据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}}容易出错:如果我更新了LibBgit:LibA中的提交校验和,却忘记了更新AppC中的校验和,那么我将不会在stack.yaml中获得新的LibA。我认为,LibB的较新校验和应已包含较新的AppC的信息,并且LibA的开发人员无需在以下位置更新AppC的校验和: LibB,但只有LibA的校验和。

2 个答案:

答案 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