首页 > 解决方案 > 构建 Spock 教程示例失败

问题描述

我想稍微了解一下 Haskell,因此看了一下 Spock 框架。首先,我从我的 Arch Linux 机器上卸载了所有与 Haskell 相关的东西,并使用各自网站上的安装脚本安装了 ghcup、Cabal 和 Stack。

现在我想按照Spock 的教程。尝试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 做一些小事,但是使用构建系统,我已经走出了自己的舒适区。帮助和提示表示赞赏。哦,当然,所有版本都是本文发布时的最新版本。

标签: haskellcabalhaskell-stackhaskell-spock

解决方案


由于依赖版本不兼容,Spock不会使用 GHC 8.8 及更高版本构建。Spock issue #149中描述了一个类似的问题,尽管我不完全确定它是完全相同的不兼容性。您从 Stack 得到的错误提示了这一点,与 GHC 8.8 捆绑的basebase-4.13.0.0版本也是如此。cabal-install 以更模糊的方式失败,因为在注意到不兼容后,它尝试使用旧版本的Spock解决依赖关系,最终选择 0.9.0.1,尝试并且由于缺少重新路由依赖的版本上限,失败建造它。

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

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

$ ghcup install 8.6.5
$ ghcup set 8.6.5

然后,使用 cabal-install 创建一个空白项目:

$ mkdir myproject
$ cd myproject
$ cabal init

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

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

最后,您可以运行:

$ cabal build

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

lts-14.27通过更改为解析器(使用 GHC 8.6.5 的最新版本),跟踪所有需要覆盖的依赖版本(正如您已经开始做的那样)并手动跟踪,它可能也可以与 Stack 一起使用将它们添加extra-depsstack.yaml.


推荐阅读