你是使用 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特殊性,如ghc
、ghci
等在某个地方,但是通过符号链接链接到了/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 check
和
ghc-pkg recache
。您可能已经以某种奇怪的方式安装了某些东西。)
如果您通过二进制安装程序或软件包管理器安装了
ghc
、
cabal
等工具,这似乎是个不错的主意,我认为将平台库保持为神圣的,并确保您永远不会从 Hackage 全局安装任何内容;除其他因素外,这很可能会使您覆盖平台库——尽管这似乎不是这里的困难所在:如果是,那么会更明显。