如何通过 GHCup+cabal 管理 XMonad(以及 xmobar 和其他相关内容)?

问题描述 投票:0回答:1

事实证明执行起来就足够了

cabal install --package-env=$HOME/.config/xmonad --lib base xmonad xmonad-contrib

但我不明白的是:

  • 为什么会起作用?
  • 为什么通过 GHCup 更新 GHC 会“破坏”模块?
  • 当我写“breaks”时,考虑到下面的原始问题,我应该说“hides”吗?
  • 什么是隐藏包?
  • 执行
    cabal install --lib the-stuff-that-hls-claims-hidden
    是否错误?
  • GHCup 更新的正确方法是什么? (显然,只是运行
    ghcup tui
    并对新内容执行
    i
    s
    以及对旧内容执行
    u
    会使事情处于糟糕的状态。)

我认为它们都归结为某个点:我对 GHCup 和 Haskell 生态系统的总体误解。


原问题

当我开始使用 XMonad 时,我很难运行它,原因是我像任何其他程序一样通过

pacman
安装,因为我在 ArchLinux 上,但我在家中也安装了
ghc
,通过
ghcup
,并可通过
PATH
获得。最终我在ArchLinux论坛上询问,并设法解决了问题。

当时我的选择是通过

xmonad
安装
cabal
(通过
ghcup
安装)。我选择的原因是我喜欢GHCup,并且我发现
ghcup tui
是一种非常方便的方式来获得最新推荐的HLS版本、最新版本的Cabal、最新推荐且由hls驱动的GHC版本.

我以为我已经理解使用通过

cabal
安装的 XMonad 的含义是什么。

但显然我错了:我刚刚通过 GHCup 0.1.20.0 更新到 GHC 9.4.8、Cabal 3.10.2.1 和 HLS 2.5.0.0,...

...现在我无法重新编译 XMonad,错误类似于“我找不到任何东西!”,如您所见:

Errors detected while compiling xmonad config: /home/enlico/.config/xmonad/xmonad.hs
$ ghc --make xmonad.hs -i -ilib -fforce-recomp -main-is main -v0 -outputdir /home/enlico/.cache/xmonad/build-x86_64-linux -o /home/enlico/.cache/xmonad/xmonad-x86_64-linux

xmonad.hs:2:1: error:
    Could not find module ‘XMonad’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
2 | import XMonad
  | ^^^^^^^^^^^^^

xmonad.hs:3:1: error:
    Could not find module ‘XMonad.Hooks.DynamicLog’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
3 | import XMonad.Hooks.DynamicLog
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:4:1: error:
    Could not find module ‘XMonad.Hooks.EwmhDesktops’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
4 | import XMonad.Hooks.EwmhDesktops
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:5:1: error:
    Could not find module ‘XMonad.Hooks.StatusBar’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
5 | import XMonad.Hooks.StatusBar
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:6:1: error:
    Could not find module ‘XMonad.Hooks.StatusBar.PP’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
6 | import XMonad.Hooks.StatusBar.PP
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:7:1: error:
    Could not find module ‘XMonad.Layout.NoBorders’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
7 | import XMonad.Layout.NoBorders
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:8:1: error:
    Could not find module ‘XMonad.Layout.Spacing’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
8 | import XMonad.Layout.Spacing
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:9:1: error:
    Could not find module ‘XMonad.Util.EZConfig’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
  |
9 | import XMonad.Util.EZConfig (additionalKeysP)
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:10:1: error:
    Could not find module ‘XMonad.Util.Loggers’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
   |
10 | import XMonad.Util.Loggers
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:11:1: error:
    Could not find module ‘XMonad.Util.Ungrab’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
   |
11 | import XMonad.Util.Ungrab
   | ^^^^^^^^^^^^^^^^^^^^^^^^^

xmonad.hs:12:1: error:
    Could not find module ‘XMonad.StackSet’
    Use -v (or `:set -v` in ghci) to see a list of the files searched for.
   |
12 | import qualified XMonad.StackSet as W
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

修复问题的失败尝试是:

cabal install --overwrite-policy=always --package-env=$HOME/.config/xmonad xmonad xmonad-contrib

上面的错误是在重新编译 XMonad 时出现的,但请注意,我已经重新尝试重新编译,以便将错误粘贴到问题中,所以我不能 100% 确定在我之后重新编译 XMonad 时错误是否相同运行上面的

cabal
命令。


顺便说一句,我已经习惯了这样一个事实:当我通过 GHCup 更新内容时,某些模块会出现问题。

例如,现在我打开了一个用于黑客排名挑战或其他活动的 haskell 文件,我注意到有一行被 HLS 标记为错误:

import Flow ((|>))

执行

cabal install --lib flow
可以修复该问题。

但是重新加载 HLS 后,另一行显示错误:

import qualified Data.Map.Strict as M

现在我读到的错误是这样的:

Could not load module ‘Data.Map.Strict’
It is a member of the hidden package ‘containers-0.6.7’.
You can run ‘:set -package containers’ to expose it.
(Note: this unloads all the modules in the current scope.)

并执行

cabal install --lib containers
修复是,但这是正确的步骤吗?

haskell archlinux xmonad ghcup
1个回答
0
投票
  • 为什么会起作用?
  • 为什么通过 GHCup 更新 GHC 会“破坏”模块?

GHC 不仅按库版本来版本其库,还按编译器版本来版本:每个单独的编译器都维护自己单独的包存储库,这些存储库不以任何方式相互协调。因此,问题的简短版本是,当 ghcup 安装新版本的 GHC 时,唯一可用的软件包是 GHC 本身附带的软件包,直到您采取一些措施来更改它。

  • 当我写“breaks”时,考虑到下面的原始问题,我应该说“hides”吗?
  • 什么是隐藏包?

不,绝对不要说“隐藏”,因为这是 GHC 软件包数据库已经声明的技术术语。在包数据库中,包可以是“公开的”或“隐藏的”;当您直接使用 GHC(即不通过 cabal-install)构建新事物或直接启动 ghci(即不通过

cabal repl
)时,您可能只直接依赖于公开的软件包(尽管您可以传递依赖于隐藏的软件包) .

  • 执行
    cabal install --lib the-stuff-that-hls-claims-hidden
    是否错误?

既然您已经发现并正在使用包环境,我认为这很好。稍微好一点的方法是将您的 xmonad 配置转换为自己的 cabal 包 - 即使用列出包依赖项和版本约束等的

.cabal
文件 - 并运行
cabal build && cp $(cabal list-bin xmonad) <wherever you need the xmonad executable to go>

  • GHCup 更新的正确方法是什么? (显然,只是运行 ghcup tui 并在新内容上执行 i 和 s,而在旧内容上执行 u 会使事情处于糟糕的状态。)

首先更新 GHC,然后使用

cabal
更新 GHC 的软件包数据库。

© www.soinside.com 2019 - 2024. All rights reserved.