【问题标题】:Why does Stack not recognize the dependency it just installed?为什么 Stack 无法识别它刚刚安装的依赖项?
【发布时间】:2023-03-30 16:19:01
【问题描述】:

所以我尝试使用 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 有什么区别?

【问题讨论】:

    标签: haskell cabal cabal-install haskell-stack wxhaskell


    【解决方案1】:

    stack 和 cabal install 之间的区别在于 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。把额外的deps放在那里。

    它不会构建

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

    它仍然不会构建

    您可能必须尝试使用​​旧版本的 wxdirect。 Stackage 包有时(但并非通常)落后于每个包的最后一个版本。

    它仍然无法构建

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

    【讨论】:

    • 在我的 .cabal 中,我可以简单地将“wx -any”添加到我的构建部门。使用堆栈,我不能只添加“- wxdirect -any”,而是我似乎必须实际指定版本号,这……很烦人。有没有办法解决这个问题,即是否有等效于“-any”?
    • 不要在堆栈问题上纠缠 Ed Kmett。如果我没记错的话,那是 Michael Snoyman 的领域。
    • @allidoiswin 据我所知,没有。 Stack 的理念是将每个包修复为特定版本,因为它消除了广泛的依赖管理问题。当然,如果 wx 被添加到 Stackage,您将永远不会再次输入版本号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2016-12-13
    • 2017-01-18
    • 2010-11-28
    • 1970-01-01
    • 2020-12-04
    • 2012-10-04
    相关资源
    最近更新 更多