构建 Spock 教程示例失败
Building the Spock tutorial example fails
我想稍微了解一下 Haskell,因此看了一下 Spock 框架。为了开始清理,我从我的 Arch Linux 机器上卸载了所有 Haskell 相关的东西,并使用各自网站上的安装脚本安装了 ghcup、Cabal 和 Stack。
现在我要关注Spock's Tutorial。尝试按照建议使用 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 on the topic 上找到了一个问题,但解决方案不适用,因为我没有尝试使用特定版本的库。
所以我尝试跟随并只在本地构建。
但是当我到达它说 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 做一些小事,但是对于构建系统,我已经超出了我的舒适区。帮助和提示表示赞赏。哦,当然所有版本都是截至本次 post.
的最新版本
由于依赖项的版本不兼容,Spock 将无法使用 GHC 8.8 及更高版本构建。 Spock issue #149 中描述了一个类似的问题,但我不完全确定它是完全相同的不兼容性。您从 Stack 得到的错误暗示了这一点,因为 base-4.13.0.0
是与 GHC 8.8 捆绑在一起的 base 的版本。 cabal-install 以一种更隐蔽的方式失败了,因为在注意到不兼容性后,它尝试使用旧版本的 Spock 解决依赖关系,最终选择 0.9.0.1,尝试并感谢缺少 reroute 依赖项的版本上限,无法构建它。
(此答案发布后不久,缺少上限 was retrofitted to the old Spock version,因此现在尝试重现该问题将导致更容易理解的失败。)
撇开教程不谈,考虑到这些复杂情况,使用 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 添加到 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 一起工作,跟踪所有需要覆盖的依赖版本(就像你开始做的那样)并手动将它们添加到 stack.yaml
的 extra-deps
。
我想稍微了解一下 Haskell,因此看了一下 Spock 框架。为了开始清理,我从我的 Arch Linux 机器上卸载了所有 Haskell 相关的东西,并使用各自网站上的安装脚本安装了 ghcup、Cabal 和 Stack。
现在我要关注Spock's Tutorial。尝试按照建议使用 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 on the topic 上找到了一个问题,但解决方案不适用,因为我没有尝试使用特定版本的库。
所以我尝试跟随并只在本地构建。
但是当我到达它说 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 做一些小事,但是对于构建系统,我已经超出了我的舒适区。帮助和提示表示赞赏。哦,当然所有版本都是截至本次 post.
的最新版本由于依赖项的版本不兼容,Spock 将无法使用 GHC 8.8 及更高版本构建。 Spock issue #149 中描述了一个类似的问题,但我不完全确定它是完全相同的不兼容性。您从 Stack 得到的错误暗示了这一点,因为 base-4.13.0.0
是与 GHC 8.8 捆绑在一起的 base 的版本。 cabal-install 以一种更隐蔽的方式失败了,因为在注意到不兼容性后,它尝试使用旧版本的 Spock 解决依赖关系,最终选择 0.9.0.1,尝试并感谢缺少 reroute 依赖项的版本上限,无法构建它。
(此答案发布后不久,缺少上限 was retrofitted to the old Spock version,因此现在尝试重现该问题将导致更容易理解的失败。)
撇开教程不谈,考虑到这些复杂情况,使用 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 添加到 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 一起工作,跟踪所有需要覆盖的依赖版本(就像你开始做的那样)并手动将它们添加到 stack.yaml
的 extra-deps
。