为什么 Stack 无法识别它刚刚安装的依赖项?

Why does Stack not recognize the dependency it just installed?

所以我正在尝试使用 reactive-banana + wxHaskell 进行 GUI 编程。作为 Haskell 及其开发工具的新手,我对堆栈感到非常困惑。

所以我尝试 stack install wx,它提示我安装 wxcore,它提示我安装 wxcwxdirect。在 stack install wxdirect 之后,我尝试 运行 stack install wxc ,但是你瞧:

While constructing the BuildPlan the following exceptions were encountered:

--  Failure when adding dependencies:    
  wxdirect: needed (>=0.90.1.1), not present in build plan (latest is 0.92.1.0)
needed for package: wxc-0.92.1.1

--  While attempting to add dependency,
Could not find package wxdirect in known packages

Recommended action: try adding the following to your extra-deps in {project root}/stack.yaml
- wxdirect-0.92.1.0

简而言之,我正在尝试像 cabal-install 一样使用 stack。而且我不确定为什么这是错误的。如果错了,那么 stackcabal-install 有什么区别?

stack 和 cabal 安装的区别在于 stack 需要一个精选的(包,版本)列表。结果是 stack 将确保那些版本的包都可以编译并且是愉快的。不过,wxdirect 似乎还没有出现在精选列表中。您应该 file a PR with stackage,这是一件很棒的事情,因为它也会为其他用户解决此问题。

您也可以采纳最后几行中给出的建议:

Recommended action: try adding the following to your extra-deps in {project root}/stack.yaml
- wxdirect-0.92.1.0

并修改您的 stack.yaml 文件。更改默认值

# Packages to be pulled from upstream that are not in the resolver (e.g., acme-missiles-0.3)
extra-deps: []

extra-deps:
- wxdirect-0.92.1.0

stack 现在将尝试安装,假装该(包、版本)已进入精选列表。

您可能仍然 运行 遇到以下问题。

我没有 stack.yaml

如果你不在一个项目中(并且你想将一个包堆叠安装到用户数据库,cabal install 会默默地做这件事),你会 运行 进入这个。这是 stack 和 cabal install 之间的区别之一,但这是一个很好的区别:cabal 安装包只是将它放入全局数据库中。这很好,直到需要更新包。使用堆栈,您总是在一个项目中。如果您 运行 堆栈在带有 stack.yaml 的项目之外,堆栈将参考您的 ~/.stack/global/stack.yaml。只需将 extra-deps 放在那里即可。

它不会构建

确保堆栈升级并且使用 resolver: 中的最新 LTS 版本,stack.yaml 中的另一个字段。这可确保您拥有最新的策展。

它仍然无法构建

您可能需要尝试旧版本的 wxdirect。 Stackage 软件包有时(但通常不会)落后于每个软件包的最新版本。

还是建不起来

您可能 运行 遇到堆栈问题。我以前见过堆栈错误。您也可以在 IRC channel 上提问。如果这不起作用,请在 /r/haskell 上找 Edward Kmett,他会用数学解决它。