构建斯波克教程示例失败



我想开始使用Haskell,因此查看了Spock框架。为了开始清理,我从我的Arch Linux机器上卸载了所有与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。这样,我得到了关于focusprimitive的另外两个建议。当我添加这些时,计划再次失败,这次没有一个简单的解决方案:

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做一些小事情,但用构建系统,我已经远远超出了我的舒适区。感谢您的帮助和提示。哦,当然所有的版本都是这篇文章发布时的最新版本。

由于依赖项版本不兼容,Spock不会使用GHC8.8及更高版本进行构建。斯波克第149期中描述了类似的问题,尽管我不完全确定它是否完全相同。您从Stack得到的错误暗示了这一点,因为base-4.13.0.0是与GHC8.8捆绑在一起的base的版本。cabal安装以一种更模糊的方式失败了,因为在注意到不兼容性后,它试图使用旧版本的Spock解决依赖关系,最终选择0.9.0.1,尝试,并且由于重新路由依赖关系的版本上限缺失,未能构建它。

(在这个答案发布后不久,丢失的上限被修改为旧的Spock版本,因此现在尝试重现问题将导致更容易理解的失败。(

抛开教程不谈,考虑到这些复杂性,使用Spock最简单的方法可能是通过cabal安装3+。首先使用ghcup切换到GHC 8.6.5:

$ ghcup install 8.6.5
$ ghcup set 8.6.5

然后,创建一个带有cabal安装的空白项目:

$ mkdir myproject
$ cd myproject
$ cabal init

Spock添加到myproject.cabal:的build-depends部分

build-depends:       base >=4.12 && <4.13
, Spock == 0.13.*

最后,您可以运行:

$ cabal build

它将在构建项目之前安装Spock及其依赖项。(请注意,您通常不需要使用cabal install来安装带有cabal install 3的库。(

通过更改为lts-14.27解析器(使用GHC 8.6.5的最新解析器(,跟踪所有需要重写的依赖版本(就像您开始做的那样(,并手动将它们添加到stack.yamlextra-deps中,也可以使其与Stack一起工作。

相关内容

  • 没有找到相关文章

最新更新