我的Haskell包开发版最近的Travis CI build报错
MissingH 必须匹配 >=1.3.0.1,但堆栈配置没有指定版本(最新匹配版本为 1.4.0.1)
在为 GHC 8.6.1 构建时,即使我有
MissingH >=1.3.0.1
在我的 build-depends
.
我不明白这个错误:这似乎是矛盾的。我对 MissingH 没有上限,为什么会出错而不使用最新的?
您需要添加MissingH
到stack.yaml
.
extra-deps:
- 'MissingH-1.4.0.1'
您的包的*.cabal
文件说明了哪些版本的依赖项与您的包兼容。这是一个松散的规范,并非所有组合都可能真正起作用(因为它们可能在传递依赖项上有冲突的界限,或者您未测试过的特定版本存在一些不可预见的破坏)。
相反,stack.yaml
描述特定版本的包的特定快照。这恰恰说明了“我的包已知可以与这些版本一起使用”。当然,维护每个依赖项的版本很繁琐,为此 Stackage 团队维护了一个“解析器”,一组已知可以协同工作的包版本,您可以使用它来一次指定多个包的版本, 通过适当地设置resolver:
字段stack.yaml
。解析器仅列出 Hackage 上的一部分包,因此当其中一个依赖项不存在时,您需要将其添加到您stack.yaml
的extra-dep
.
更新:在讨论之后,需要更多关于配置 travis 的详细信息。
首先,我目前对 Haskell 项目 CI 的首选解决方案是不打扰堆栈,而是使用https://github.com/haskell-CI/haskell-ci,它使用 cabal-install 生成一个 travis 脚本。
现在寻求一个不太激进的解决方案。
目前travis 脚本只是改变--resolver
选项,但据我所知,没有命令行选项可以添加额外的 dep。似乎stack.yaml
文件是唯一的方法。此外,我们只想MissingH
为最新的 nightlies 指定一个额外的 dep,因为 LTS 已经包含它。
因此,我提出以下建议:
仅为每晚解析器创建一个单独stack.yaml
的,将其称为其他名称,因为您已经有了一个,例如stack-nightly.yaml
packages:
- .
extra-deps:
- 'MissingH-1.4.0.1'
设置一个环境变量以指向stack-nightly.yaml
解析器是每晚的时间,也许是:
env:
...
- $RESOLVER=nightly STACK_YAML=stack-nightly.yaml
# Not sure of the syntax.
否则,您可以使用--stack-yaml
命令行选项。