被宣传为Haskell工具的突破,我尝试从Cabal切换到Stack . 但是,我仍然遇到一个问题,即使用与cabal一起运行的堆栈运行项目 . 我认为问题在于解析器设置的全局约束(例如来自堆栈的长期支持包)不符合本地包依赖性 .
举个具体的例子,我在版本0.14.0.6中使用了snap框架(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 回答
我建议尝试给一个非LTS求解器:
要么
这通常比使用
lts-*
求解器更容易给出工作结果,除非你来自Cabal,你现在还没有LTS,所以你不妨开始使用常规的ghc-7.10
或ghc-7.8
解析器,然后看看如果你以后可以转移到LTS .附:你也可以试试夜莺,我想是在
lts-*
和_1693338之间,但我自己也没试过 .EDIT: 在
stack init
命令之后,您通常还需要运行stack solver --modify-stack-yaml
来填充stack.yaml
中的extra-deps
部分,并使用.cabal
文件中build-depends
部分计算的构建依赖关系 . 我认为发生的事情是init
仅使用指定的解算器配置项目,但不会对此信息进行任何更正 . )您的项目SnapFull会询问其依赖项的旧版本(例如
base < 4.4
和lens < 3.8
) . 这些版本比第一个Stackage快照提供的版本旧,这解释了为什么堆栈无法找到构建计划 . 很可能,解决问题的最简单方法是更新项目的.cabal文件以使用这些依赖项的最新版本 . 另外,snap-loader- *包不在Stackage中,因此需要将它们添加到stack.yaml
的extra-deps
字段中 .stack solver --modify-stack-yaml
命令可以为您执行此操作 .P.S . :This page告诉最新的Stackage LTS快照包含哪些包和版本 . 您还可以通过页面顶部的"Snapshots"链接检查其他快照 .