堆栈构建工具:与 LTS 解析器的兼容性问题
Stack build tool: compatibility issue with LTS resolver
被宣传为 Haskell 工具的突破,我尝试从 Cabal 切换到 Stack。但是,我仍然无法将项目 运行 与 运行 与 cabal 的堆栈联系起来。我认为问题在于解析器设置的全局约束(例如来自堆栈的长期支持包)不符合本地包依赖性。
举个具体的例子,我在0.14.0.6版本中使用了snap框架(http://snapframework.com/)。使用 snap init
创建完整的 snap 项目后,我尝试使用 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
我建议尝试使用非 LTS 求解器:
$ stack init --resolver=ghc-7.10 --force
或
$ stack init --resolver=ghc-7.8 --force
这通常比使用 lts-*
求解器更容易给出工作结果,除非您无法从 LTS 的稳定性中获益。但是因为你来自 Cabal,所以你之前没有 LTS,所以你不妨从常规 ghc-7.10
或 ghc-7.8
解析器开始,看看你是否可以转移到 LTS稍后。
P.S. 你也可以试试晚间,我猜是在 lts-*
和 ghc-*
之间,但我没有我自己没试过。
编辑: 在 stack init
命令之后,您通常还需要 运行 stack solver --modify-stack-yaml
来填充 extra-deps
部分您的 stack.yaml
具有从 .cabal
文件中的 build-depends
部分计算的构建依赖项。我认为正在发生的事情是 init
仅使用指定的求解器配置项目,但不调用实际的依赖项解析。 (如果对此信息有任何更正,我将不胜感激。)
您的项目 SnapFull,要求提供太旧的依赖项版本(例如 base < 4.4
和 lens < 3.8
)。这些版本比第一个 Stackage 快照提供的版本旧,这解释了为什么 Stack 无法找到构建计划。很可能,解决问题的最简单方法是更新项目的 .cabal 文件以使用这些依赖项的最新版本。此外,snap-loader-* 包不在 Stackage 中,因此需要将它们添加到 stack.yaml
的 extra-deps
字段中。 stack solver --modify-stack-yaml
命令可以为您做到这一点。
P.S.: This page 告诉最新的 Stackage LTS 快照中包含哪些包和版本。您还可以通过页面顶部的"Snapshots" link查看其他快照
被宣传为 Haskell 工具的突破,我尝试从 Cabal 切换到 Stack。但是,我仍然无法将项目 运行 与 运行 与 cabal 的堆栈联系起来。我认为问题在于解析器设置的全局约束(例如来自堆栈的长期支持包)不符合本地包依赖性。
举个具体的例子,我在0.14.0.6版本中使用了snap框架(http://snapframework.com/)。使用 snap init
创建完整的 snap 项目后,我尝试使用 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
我建议尝试使用非 LTS 求解器:
$ stack init --resolver=ghc-7.10 --force
或
$ stack init --resolver=ghc-7.8 --force
这通常比使用 lts-*
求解器更容易给出工作结果,除非您无法从 LTS 的稳定性中获益。但是因为你来自 Cabal,所以你之前没有 LTS,所以你不妨从常规 ghc-7.10
或 ghc-7.8
解析器开始,看看你是否可以转移到 LTS稍后。
P.S. 你也可以试试晚间,我猜是在 lts-*
和 ghc-*
之间,但我没有我自己没试过。
编辑: 在 stack init
命令之后,您通常还需要 运行 stack solver --modify-stack-yaml
来填充 extra-deps
部分您的 stack.yaml
具有从 .cabal
文件中的 build-depends
部分计算的构建依赖项。我认为正在发生的事情是 init
仅使用指定的求解器配置项目,但不调用实际的依赖项解析。 (如果对此信息有任何更正,我将不胜感激。)
您的项目 SnapFull,要求提供太旧的依赖项版本(例如 base < 4.4
和 lens < 3.8
)。这些版本比第一个 Stackage 快照提供的版本旧,这解释了为什么 Stack 无法找到构建计划。很可能,解决问题的最简单方法是更新项目的 .cabal 文件以使用这些依赖项的最新版本。此外,snap-loader-* 包不在 Stackage 中,因此需要将它们添加到 stack.yaml
的 extra-deps
字段中。 stack solver --modify-stack-yaml
命令可以为您做到这一点。
P.S.: This page 告诉最新的 Stackage LTS 快照中包含哪些包和版本。您还可以通过页面顶部的"Snapshots" link查看其他快照