使用堆栈时如何在 .cabal 中查找依赖项

How to find the dependencies in .cabal when using stack

我最近在学习 Haskell。我在 Github 中有一个有趣的项目:https://github.com/tmishima/Hinecraft 我克隆了它,我想自己构建它 运行。但是我遇到了这样的堆栈构建问题

Resolver 'lts-13.0' does not have all the packages to match your requirements.
FTGL not found
    - Hinecraft requires -any
GLUtil not found
    - Hinecraft requires -any
OpenGLRaw version 3.3.1.0 found
    - Hinecraft requires <=2.3.0.0

看起来在堆栈中找不到这些依赖项,我该怎么办?我应该手动下载这些依赖项并在本地构建它们吗? 感谢您的帮助。

.cabal 依赖代码

build-depends:       
                 base , GLFW-b , OpenGL , mtl
                 , bytestring , array , vector , directory
                 , process , OpenGLRaw <= 2.3.0.0 , cereal , FTGL
                 , time , containers , GLUtil , linear , text
                 , sqlite-simple

stackage的包集中没有包含这些依赖(可以在https://www.stackage.org/lts-13.0中查看)。 但是,它们位于 hackage 存储库中 (f.e。http://hackage.haskell.org/packages/search?terms=GLUtil),您可以使用它们在 stack.yaml 配置文件中添加 extra-deps 部分来创建堆栈:

resolver: lts-13.0
extra-deps:
  - FTGL-2.1
  - GLUtil-0.10.3
  - OpenGLRaw-2.3.0.0

我没有测试构建,可能会因为依赖项不兼容而失败。

我试过构建包,但上面的配置不起作用。 actual cabal file 没有 OpenGLRaw <= 2.3.0.0 约束,您是否出于某种原因添加了约束?

如果不是这样,您可以尝试构建它,从 cabal 文件中删除约束,并使用此 stack.yaml,它使用默认值 OpenGLRaw-3.3.1.0:

resolver: lts-13.0
extra-deps:
  - FTGL-2.1
  - GLUtil-0.10.3

由于该软件包需要旧版本的 OpenGLRaw (2.3.0.0),我设法定义了一个使用该版本的配置文件,使用 lts-6.35:

resolver: lts-6.35
extra-deps:
 - FTGL-2.1
 - GLURaw-1.4.0.2
 - GLUtil-0.8.8
 - hpp-0.3.1.0
 - OpenGL-2.13.0.0
 - OpenGLRaw-2.3.0.0

希望对您有所帮助!

附带说明一下,我不得不提到 cabal 能够使用原始约束构建包,无需进一步配置(尽管它选择了不同版本的库)。