2

被宣传为 Haskell 工具的突破,我尝试从 Cabal 切换到 Stack。但是,我仍然无法让项目使用与 cabal 一起运行的堆栈来运行。我认为问题在于解析器设置的全局约束(例如堆栈中的长期支持包)不符合本地包依赖关系。

举个具体的例子,我在 0.14.0.6 版本中使用了 snap 框架 ( http://snapframework.com/ )。使用 . 创建完整的 snap 项目后snap init,我尝试使用stack init. 但是,堆栈没有找到满足约束的构建计划。另一方面,acabal 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
4

2 回答 2

3

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

PS:此页面告诉最新的 Stackage LTS 快照中包含哪些包和版本。您还可以通过页面顶部的“快照”链接查看其他快照。

于 2015-10-10T17:18:49.357 回答
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。

PSlts-*你也可以试试nightlies ,我猜这介于两者之间ghc-*,但我自己没有尝试过。

编辑:stack init命令之后,您通常还需要运行 以使用从文件中的部分计算的构建依赖项stack solver --modify-stack-yaml填充extra-deps您的部分。我认为正在发生的事情是仅使用指定的求解器配置项目,但不调用实际的依赖关系解析。(我将不胜感激对此信息的任何更正。)stack.yamlbuild-depends.cabalinit

于 2015-10-10T10:54:14.723 回答