Cabal版本中的“未指定版本”是什么意思?

时间:2018-10-01 18:12:45

标签: haskell travis-ci cabal stackage

Travis CI builddevelopment version中最近的my Haskell package报告错误

  

MissingH必须匹配> = 1.3.0.1,但是堆栈配置没有指定的版本(最新匹配的版本是1.4.0.1)

when building for GHC 8.6.1,即使我有

MissingH >=1.3.0.1 

in my build-depends

我不明白这个错误:这似乎是矛盾的。我对MissingH没有上限,为什么会出错并且不使用最新的?

1 个答案:

答案 0 :(得分:1)

您需要将MissingH添加到stack.yaml

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

  • 相反,stack.yaml描述了特定的软件包快照,它们固定在特定的版本上。确切地说,“我的软件包可用于这些版本”。当然,维护每个依赖项的版本很繁琐,并且对于Stackage团队来说,维护一个“解析器”是一套可以协同工作的精选软件包版本,可用于一次指定许多软件包的版本。 ,通过适当设置resolver:的{​​{1}}字段。解析程序仅列出Hackage上软件包的子集,因此当您的依赖项不在其中时,您需要将其作为stack.yaml添加到stack.yaml中。


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

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

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

当前travis script仅改变了extra-dep选项,但据我所知,没有命令行选项可以添加额外的dep。看来--resolver文件是唯一的方法。此外,我们只想将stack.yaml指定为最新夜间的额外服务,因为LTS已经包含了它。

因此,我建议以下内容:

  1. 仅为夜间解析器创建一个单独的MissingH,由于您已经拥有一个stack.yaml

    ,因此将其命名为其他名称
    stack-nightly.yaml
  2. 设置为每天晚上解析器指向packages: - . extra-deps: - 'MissingH-1.4.0.1' 的环境变量,

    stack-nightly.yaml

    否则,您可以使用env: ... - $RESOLVER=nightly STACK_YAML=stack-nightly.yaml # Not sure of the syntax. 命令行选项。