我想使用Haskell一点,因此我看了一下Spock框架。为了开始清理,我从我的Arch机器卸载了所有Haskell相关的东西,并使用各自网站上的安装脚本安装了ghcup、Cabal和Stack。
现在我想跟着斯波克教程。按照建议,尝试用cabal install Spock全局安装Spock会给我一个错误(缩写):
src/Web/Spock/Internal/Wire.hs:43:1: error:
Could not find module ‘Web.Routing.AbstractRouter’
Use -v (or `:set -v` in ghci) to see a list of the files searched for.
|
43 | import Web.Routing.AbstractRouter
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cabal: Failed to build Spock-0.9.0.1. See the build log above for details.我已经在关于这个主题的reddit上找到了一个问题,但是这个解决方案并不适用,因为我并不试图按照隐含的方式使用特定版本的库。
所以我试着跟着做,只在本地建造。但是,当我到达它说的stack build --fast --pedantic时,构建计划就无法构建,Stack建议添加另一个依赖项stm-containers。为此,我将为focus和primitive提供两个额外的建议。当我添加这些内容时,计划再次失败,这一次没有一个简单的解决方案:
In the dependencies for primitive-0.6.4.0:
base-4.13.0.0 from stack configuration does not match >=4.5 && <4.13 (latest matching version is 4.12.0.0)
needed due to Spock-example-0.1.0.0 -> primitive-0.6.4.0我可以用Haskell做点小事情,但是有了构建系统,我就离开了我的舒适区。感谢你的帮助和暗示。哦,当然所有版本都是这篇文章发布之前的最新版本。
发布于 2020-04-11 15:30:25
由于依赖项的不兼容版本,Spock不会使用GHC8.8和更高版本进行构建。在史波克第149期中也描述了一个类似的问题,尽管我不能完全确定它是否完全相同。您从Stack获得的错误提示了这一点,因为base-4.13.0.0是与GHC8.8捆绑在一起的base版本。阴谋安装以一种更模糊的方式失败了,因为在注意到不兼容性之后,它试图使用较早版本的Spock来解决依赖关系,最终选择0.9.0.1,尝试并由于重新路由依赖项缺少版本上限而未能构建它。
(这个答案发布后不久,缺失的上限版本,所以现在试图重现问题将导致一个更容易理解的失败。)
抛开本教程不谈,考虑到这些复杂情况,使用Spock最直接的方法可能是通过阴谋安装3+。首先使用ghcup切换到GHC 8.6.5:
$ ghcup install 8.6.5
$ ghcup set 8.6.5然后,创建一个带有阴谋安装的空白项目:
$ mkdir myproject
$ cd myproject
$ cabal init将Spock添加到myproject.cabal的myproject.cabal部分
build-depends: base >=4.12 && <4.13
, Spock == 0.13.*最后,您可以运行:
$ cabal build它将在构建项目之前安装Spock及其依赖项。(请注意,您通常不需要使用cabal install来安装带有cabal 3的库。)
通过切换到lts-14.27解析器(使用GHC8.6.5的最新版本)、跟踪所有需要覆盖的依赖版本(就像您开始做的那样),并手动将它们添加到extra-deps of stack.yaml中,也可以使它与Stack一起工作。
https://stackoverflow.com/questions/61154102
复制相似问题