是否因为省略了依赖项而将包从 Stackage LTS 中排除?

Posted

技术标签:

【中文标题】是否因为省略了依赖项而将包从 Stackage LTS 中排除?【英文标题】:Is a package excluded from Stackage LTS because of an omitted dependency? 【发布时间】:2018-10-14 18:38:58 【问题描述】:

我有点困惑,对包的依赖如何影响将它包含在 Stackage LTS 中;具体来说,如果

package A 需要 package B,并且 当包 B 是 installed as an extra-dep 在 LTS-X.Y 之上时,包 A 有效,但是 包B本身是not in LTS-X.Y,

是否从 LTS-X.Y 打包 A have to be excluded,特别是如果

排除 B 的唯一原因是 because of a test suite dependency,而不是库本身的依赖项?

【问题讨论】:

是的。但我想 LTS 的重点是拥有“正常工作”的软件包。这就是为什么那些有问题的没有被列出的原因。但是,我知道 LTS 中的某些包在某些情况下不能使用开箱即用的堆栈进行编译,特别是因为堆栈没有在 Windows 上正确设置 msys。所以我不确定了 @M.Aroosi 这让我感到困惑:A 与 LTS-X.Y + B 一起工作,如果 B 在 LTS-X.Y 中,A 将工作,B 将作为 LTS 的一部分工作。换句话说,B 和 A 将一起“正常工作”并作为 LTS 的一部分。 【参考方案1】:

我会复制/粘贴my answer on github


包A一定要排除吗?

不,不必排除它。原因如下:

即使排除 B 的唯一原因是因为测试套件依赖性

在这种情况下,我们可以将 B 添加到构建计划中并将其标记在 skipped-tests 部分下,以避免拉入其测试套件依赖项。 LTS 和夜间快照都是如此。

(但是,更可取的做法是修复 B 的依赖问题,以便可以运行测试套件。)


为了进一步澄清,回应@bergey 的回答:

只有在包的维​​护者同意使其依赖项保持最新时才包含包

这仅适用于明确包含的包。一些包是传递依赖,它们被隐含包含在内,并不一定要遵守如此严格的标准。 (但是,将来我们可能消除隐式包含的概念,而是明确地包含所有包。)

也可以设置例外,以便包含一个包,即使它的测试套件或其基准与 snapsnot 有不兼容的依赖约束。

当然,首选的方法是不需要进行此类例外处理,我们鼓励所有维护者保持其所有构建目标为最新。

最后,请允许我指出,这个问题可能更适合the stackage mailing list,诚然没有很好地宣传或利用。

【讨论】:

【参考方案2】:

是的,对于给定 Stackage 快照中的每个包,它的所有传递依赖项也在快照中。此外,仅当包的维护者同意使其依赖关系保持最新时,才包含包。在the README on github 中有更多详细信息。一个excerpt:

所有包都可以从 Hackage 构建和测试。我们推荐使用 Stack Travis 脚本,它可以确保包不会意外地不完整。 所有包都与所有依赖项的最新版本兼容(您可以通过访问http://packdeps.haskellers.com/feed?needle=PACKAGENAME 找到限制性上限)。 快照中的所有包都与快照中使用的 GHC 随附的库版本兼容(有关宽松下限的更多信息)。

【讨论】:

所以在上述情况下,A 必须想办法放弃对 B 的依赖。对吗? 您的选择是采用 MissingH,停止依赖它,或者不将您的包放入 Stackage。 让我们假设问题的重点是找到让 a 进入 LTS 的方法。

以上是关于是否因为省略了依赖项而将包从 Stackage LTS 中排除?的主要内容,如果未能解决你的问题,请参考以下文章

sh 将包从私有PPA添加到chroot并剥离对私有PPA的引用

使用 TOAD for Oracle 将包从一个数据库复制到另一个数据库

SSIS 包从文件系统运行

如何将我的夜间 Haskell 包放入 Stackage LTS?

由于找不到依赖项而导致编译Scala程序失败

列出 R 包依赖项而不安装包