3

我的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 没有上限,为什么会出错而不使用最新的?

4

1 回答 1

5

您需要添加MissingHstack.yaml.

extra-deps:
  - 'MissingH-1.4.0.1'
  • 您的包的*.cabal文件说明了哪些版本的依赖项与您的包兼容。这是一个松散的规范,并非所有组合都可能真正起作用(因为它们可能在传递依赖项上有冲突的界限,或者您未测试过的特定版本存在一些不可预见的破坏)。

  • 相反,stack.yaml描述特定版本的包的特定快照。这恰恰说明了“我的包已知可以与这些版本一起使用”。当然,维护每个依赖项的版本很繁琐,为此 Stackage 团队维护了一个“解析器”,一组已知可以协同工作的包版本,您可以使用它来一次指定多个包的版本, 通过适当地设置resolver:字段stack.yaml。解析器仅列出 Hackage 上的一部分包,因此当其中一个依赖项不存在时,您需要将其添加到您stack.yamlextra-dep.


更新:在讨论之后,需要更多关于配置 travis 的详细信息。

首先,我目前对 Haskell 项目 CI 的首选解决方案是不打扰堆栈,而是使用https://github.com/haskell-CI/haskell-ci,它使用 cabal-install 生成一个 travis 脚本。

现在寻求一个不太激进的解决方案。

目前travis 脚本只是改变--resolver选项,但据我所知,没有命令行选项可以添加额外的 dep。似乎stack.yaml文件是唯一的方法。此外,我们只想MissingH为最新的 nightlies 指定一个额外的 dep,因为 LTS 已经包含它。

因此,我提出以下建议:

  1. 仅为每晚解析器创建一个单独stack.yaml的,将其称为其他名称,因为您已经有了一个,例如stack-nightly.yaml

    packages:
    - .
    extra-deps:
    - 'MissingH-1.4.0.1'
    
  2. 设置一个环境变量以指向stack-nightly.yaml解析器是每晚的时间,也许是:

    env:
    ...
    - $RESOLVER=nightly STACK_YAML=stack-nightly.yaml
    # Not sure of the syntax.
    

    否则,您可以使用--stack-yaml命令行选项。

于 2018-10-01T19:40:35.867 回答