Haskell cabal:我刚刚安装了包,但现在找不到这些包。

22

这篇文章 是我能找到的唯一一个原因,解释了为什么我使用 cabal 安装的软件包无法被 GHC 找到:

这是因为您在全局安装软件包时之前的软件包都是本地安装的。请注意,cabal-install默认会进行本地安装[...]。

据推测,"本地安装"指的是将软件包放在 ~/.cabal/ 中。首先问题来了: 全局安装在哪里?

我一直在使用 sudo 运行 cabal,所以我想这应该是一个全局安装?我这样做的原因是,在没有 sudo 的情况下运行时会提示权限不足,这与 "cabal-install 默认本地安装" 这一说法相矛盾。第二个问题: 如何进行本地安装和全局安装?

为了解决这个混乱的问题,我随机使用 sudo ghc-pkg unregister 命令和随意删除 ~/.cabal/ 中的东西。结果我的软件包树已经混乱了,可能是本地和全局都出了问题。第三个问题: 我该如何重新开始?


编辑: 我正在运行 Ubuntu 10.10。我安装了 Haskell 平台 2011。


你在哪个平台上?你收到了什么具体的错误信息?可能是因为以root(sudo)身份运行cabal,你已经将所有软件包安装到了/root/.cabal目录下的root用户本地(假设是某个Linux版本)。 - asm
1个回答

9
你是使用 Windows、OS X 还是某个版本的 Linux?你是否使用 Haskell 平台?之前是否安装过 ghc 或 cabal 的某个版本?当然,对于 Linux 发行版来说,你的软件包管理器可能会有些微妙之处。旧版 ghc(特别是旧版 ~/.ghc/ 目录)的痕迹可能会导致麻烦。

以下是在 #haskell 中遇到此类问题时需要考虑的一些基本思路(当然,我的理解并不完全充分):

主要问题似乎是:为什么要用 sudo 进行应该是本地安装的操作?如果 ghc 及其库位于 /usr/... 或其他受保护的位置,则全局安装(cabal install pony --global)当然需要权限,但否则,sudo 与非 sudo 是与安装位置无关的。你使用 cabal install pony --user(--user 在理论上是默认的)不应该需要超级用户权限。(我有时发现在 OS X 上需要权限调用 gcc,但这通常是由于我的设置有些奇怪。)但无论如何,sudo 不会影响 cabal 安装的位置:隐式的 --user 和显式的 --global,以及更具体的开发指令会影响安装位置。

例如,如果你运行 ghc-pkg list,它将按两个或多个 package.conf.d 目录的不同位置将软件包划分为不同的类别。目前在我的笔记本电脑上,它们是:

/Users/applicative/.ghc/x86_64-darwin-7.0.3/package.conf.d/... 

针对位于~/.cabal/lib/...目录下的本地资源以及受保护的资源

/Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/package.conf.d 

对于使用Haskell平台安装的全局软件(这个位置包含一些OS X特殊性,如ghcghci等在某个地方,但是通过符号链接链接到了/usr/bin)。不同软件包的配置文件会告诉你确切的库文件安装位置。例如,关于重要的base库,

$ cat base-4.3.1.0-f5c465200a37a65ca26c5c6c600f6c76.conf

告诉我:
import-dirs:
 /Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/base-4.3.1.0
library-dirs: 
 /Library/Frameworks/GHC.framework/Versions/7.0.3-x86_64/usr/lib/ghc-7.0.3/base-4.3.1.0

无论如何,ghc-pkg list 告诉你的 cabal install 的程序包位于哪里?在 ~/.cabal 文件夹中,查看 config 文件。如果您还没有编辑它,我认为注释和取消注释的行,如果它们声明了一个偏好,就是使用 --global--user 进行安装的默认值。在 ~.ghc/ 目录下,查看子目录 myghcversion/package.conf.d,检查是否有任何内容,这应该与 ghc-pkg 告诉您的内容相同。(如果您尚未使用过,请学习一般情况下 ghc-pkg 的选项,例如 ghc-pkg checkghc-pkg recache。您可能已经以某种奇怪的方式安装了某些东西。)
如果您通过二进制安装程序或软件包管理器安装了 ghccabal 等工具,这似乎是个不错的主意,我认为将平台库保持为神圣的,并确保您永远不会从 Hackage 全局安装任何内容;除其他因素外,这很可能会使您覆盖平台库——尽管这似乎不是这里的困难所在:如果是,那么会更明显。

哇,非常详细的回答,谢谢。我现在离开了机器,几天后会跟进。所以:cabal install foo 需要 sudo 不是很正常吗?它肯定会在 ~/.cabal/ 下安装 东西;我认为需要 sudo 是因为本地安装会做一些全局的事情。这不是事实吗? - jameshfisher
通常情况下不会有。我不确定ubuntu是否有/root目录,但如果有的话,我会检查那里是否有一个.cabal目录中的软件包。 - asm
1
啊...我快疯了。最终删除了/.ghc才解决了问题。在Ubuntu上,我卸载了haskell-platform和cabal-install,然后删除了/.cabal和~/.ghc,并更新了apt-get,然后再次安装它们。我的损坏设置终于修复了,我成功地进行了cabal install idris。使用sudo运行cabal是常识,因为许多运行apt-get的指令对sudo也存在歧义,我最初也这样做了;但我立即注意到cabal看起来很像opam,后者会按用户安装所有内容。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接