Cabal包安装与更新问题求助
你现在遇到的是旧Ubuntu系统上Haskell工具链常见的依赖冲突问题——Ubuntu 16.04自带的Cabal和GHC版本都偏老,安装threadscope需要更高版本的Cabal,但直接升级最新Cabal又因为系统base库版本不够失败。下面给你几个实用的解决方案:
方案一:用ghcup升级工具链(最推荐)
ghcup是Haskell官方推荐的工具链管理工具,能帮你轻松安装兼容的GHC和Cabal版本,不会和系统自带的工具冲突。
执行以下命令安装ghcup:
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
(如果curl无法使用,也可以用wget替代:wget https://get-ghcup.haskell.org -O - | sh)
安装过程中会引导你配置环境变量,按照提示完成后,重启终端或者执行source ~/.bashrc(如果你用zsh,就执行source ~/.zshrc)让配置生效。
接下来安装一个兼容Ubuntu 16.04的GHC版本(比如8.6.5,它对应的base库版本能满足Cabal 2.4的要求):
ghcup install ghc 8.6.5 ghcup set ghc 8.6.5
然后升级Cabal到兼容的版本:
ghcup install cabal 2.4.1.0 ghcup set cabal 2.4.1.0
最后更新Cabal包索引并安装threadscope:
cabal update cabal install threadscope
方案二:手动安装兼容版本的cabal-install
如果不想用ghcup,可以直接下载适配你当前GHC版本的cabal-install二进制包。Ubuntu 16.04自带的GHC大概是8.0.1(对应base 4.11.1.0),你需要找一个依赖Cabal库>=1.24且支持base 4.11的cabal-install版本,比如cabal-install-2.4.1.0。
- 下载对应x86_64架构的二进制包:
wget https://downloads.haskell.org/~cabal/cabal-install-2.4.1.0/cabal-install-2.4.1.0-x86_64-linux.tar.xz
- 解压到本地用户的bin目录(比如
~/.local/bin,确保这个目录在你的系统PATH环境变量中):
tar xJf cabal-install-2.4.1.0-x86_64-linux.tar.xz mv cabal ~/.local/bin/
- 更新Cabal包索引并安装threadscope:
cabal update cabal install threadscope
方案三:用Stack安装threadscope
Stack是另一个Haskell包管理工具,它会自动为项目下载合适的GHC版本,完全避开系统工具链的冲突问题。
- 安装Stack:
curl -sSL https://get.haskellstack.org/ | sh
- 直接安装threadscope:
stack install threadscope
Stack会自动下载所需的GHC和所有依赖包,安装完成后,threadscope的可执行文件会放在~/.local/bin目录下,确保这个目录在PATH中就能直接运行。
为什么之前的升级尝试失败?
你尝试安装的Cabal-3.0.0.0要求base库版本>=4.13.0,但Ubuntu 16.04自带的GHC对应的base版本是4.11.x,不满足这个要求,所以编译失败。而threadscope依赖的cairo、glib等包需要Cabal库版本>=1.24,你的系统自带的1.22.x版本无法满足,这就是核心矛盾。上面的方案都是通过升级到兼容的工具链版本来解决这个问题。
内容的提问来源于stack exchange,提问作者Yaldaba

