事实证明执行起来就足够了
cabal install --package-env=$HOME/.config/xmonad --lib base xmonad xmonad-contrib
但我不明白的是:
cabal install --lib the-stuff-that-hls-claims-hidden
是否错误?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
修复是,但这是正确的步骤吗?
- 为什么会起作用?
- 为什么通过 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 的软件包数据库。