haskell - 构建 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 做一些小事,但是使用构建系统,我已经走出了自己的舒适区。帮助和提示表示赞赏。哦,当然,所有版本都是本文发布时的最新版本。
解决方案
由于依赖版本不兼容,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 install
cabal-install 3 来安装库。)
lts-14.27
通过更改为解析器(使用 GHC 8.6.5 的最新版本),跟踪所有需要覆盖的依赖版本(正如您已经开始做的那样)并手动跟踪,它可能也可以与 Stack 一起使用将它们添加extra-deps
到stack.yaml
.
推荐阅读
- algorithm - 使用多边形 MBR 的 R-Tree 构造算法
- api - Simplygon 云 api 认证
- java - 从 txt.file 填充和删除数据
- c++ - 在 OpenGL 中垂直翻转 FreeType 文本
- sql - 如何在 Pandas 中编写此 SQL?
- wpf - MVVM Light View 不刷新绑定属性
- node.js - npm 或 webpack 错误:找不到模块 'webpack/lib/removeAndDo'
- reactjs - react-toolbox 的 Webpack 4 配置
- node.js - Node.js 工作线程中的 LevelDB
- java - 使用 ADB 时 Android Studio “找不到文件”,桌面版有效