堆栈构建工具:LTS解析器的兼容性问题

时间:2015-10-10 10:48:13

标签: haskell haskell-stack

作为Haskell工具的突破广告,我尝试从Cabal切换到Stack。但是,我仍然遇到一个问题,即使用与cabal一起运行的堆栈运行项目。我认为问题在于解析器设置的全局约束(例如来自堆栈的长期支持包)不符合本地包依赖性。

对于一个具体的例子,我在版本0.14.0.6中使用了快照框架(http://snapframework.com/)。在使用snap init创建完整的快照项目后,我尝试使用stack init从cabal文件中实例化堆栈构建计划。但是,堆栈找不到满足约束条件的构建计划。 另一方面,cabal install成功构建了项目。

我对堆栈的理解是否存在错误?如何解决这个问题?

完整的错误日志如下所示,项目名称为SnapFull:

Checking against build plan lts-3.7

* Build plan did not match your requirements:
    base version 4.8.1.0 found
    - SnapFull requires >=4 && <4.4

    lens version 4.12.3 found
    - SnapFull requires >=3.7.6 && <3.8

    snap-loader-dynamic not found
    - SnapFull requires ==0.10.*

    snap-loader-static not found
    - SnapFull requires >=0.9 && <0.10


Checking against build plan lts-2.22

* Build plan did not match your requirements:
    base version 4.7.0.2 found
    - SnapFull requires >=4 && <4.4

    lens version 4.7.0.1 found
    - SnapFull requires >=3.7.6 && <3.8

    snap-loader-dynamic not found
    - SnapFull requires ==0.10.*

    snap-loader-static not found
    - SnapFull requires >=0.9 && <0.10


Checking against build plan lts-3.8

* Build plan did not match your requirements:
    base version 4.8.1.0 found
    - SnapFull requires >=4 && <4.4

    lens version 4.12.3 found
    - SnapFull requires >=3.7.6 && <3.8

    snap-loader-dynamic not found
    - SnapFull requires ==0.10.*

    snap-loader-static not found
    - SnapFull requires >=0.9 && <0.10


Checking against build plan nightly-2015-10-09

* Build plan did not match your requirements:
    base version 4.8.1.0 found
    - SnapFull requires >=4 && <4.4

    lens version 4.12.3 found
    - SnapFull requires >=3.7.6 && <3.8

    snap-loader-dynamic not found
    - SnapFull requires ==0.10.*

    snap-loader-static not found
    - SnapFull requires >=0.9 && <0.10


There was no snapshot found that matched the package bounds in your .cabal files.
Please choose one of the following commands to get started.

    stack init --resolver lts-3.7
    stack init --resolver lts-2.22
    stack init --resolver lts-3.8
    stack init --resolver nightly-2015-10-09

You'll then need to add some extra-deps. See:

    https://github.com/commercialhaskell/stack/blob/master/doc/yaml_configuration.md#extra-deps

You can also try falling back to a dependency solver with:

    stack init --solver

2 个答案:

答案 0 :(得分:3)

我建议尝试给非LTS求解器:

$ stack init --resolver=ghc-7.10 --force

$ stack init --resolver=ghc-7.8 --force

这通常比使用lts-*解算器更容易提供工作结果,除非您无法从LTS的稳定性中受益。但是既然你是来自Cabal,那么你现在还没有LTS,所以你最好开始使用普通的ghc-7.10ghc-7.8解析器,看看你是否可以转到LTS以后。

P.S。你也可以试试夜莺,我猜是在lts-*ghc-*之间,但我自己也没试过。

编辑stack init命令之后,您通常还需要运行stack solver --modify-stack-yaml以使用构建依赖关系填充extra-deps中的stack.yaml部分根据{{​​1}}文件中的build-depends部分计算得出。我认为发生的事情是.cabal仅使用指定的解算器配置项目,但不调用实际的依赖项解析。 (我很感激对这些信息的任何更正。)

答案 1 :(得分:3)

您的项目 SnapFull 会询问其依赖项的旧版本(例如base < 4.4lens < 3.8)。这些版本比第一个Stackage快照提供的版本旧,这解释了为什么堆栈无法找到构建计划。很可能,解决问题的最简单方法是更新项目的.cabal文件以使用这些依赖项的最新版本。此外, snap-loader - * 包不在Stackage中,因此需要将它们添加到extra-deps的{​​{1}}字段中。 stack.yaml命令可以为您完成。

P.S。:This page说明最新的Stackage LTS快照中包含哪些包和版本。您还可以通过&#34;快照&#34;检查其他快照。链接在页面顶部。