我是否升级了cabal-install?

31
我刚从官方网站安装了Haskell。接着,按照它的快速入门教程进行操作。
我运行了:
cabal update

这显示了此消息:

Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install

我跑步:

cabal install cabal-install

并检查更新是否成功:

cabal update

结果显示我从一开始就收到了相同的信息:

Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install

那么,我是否升级了 cabal-install?如何检查我的 cabal 版本?

重要提示:我正在使用 Mac OS X 的 64 位版本。


3
使用命令 which cabal 查看当前正在使用的 cabal 安装版本,cabal 可能没有将新下载的版本安装到 PATH 中。请检查 ~/bin 目录是否有另一个 cabal 可执行文件。 - bisserlis
9个回答

29

在我的情况下(可能也适用于其他人),当使用Homebrew安装haskell-platform时,cabal最初被安装在/usr/local/bin中。升级cabal时,版本会被安装到$HOME/.cabal/bin/cabal中。您应该将cabal二进制文件夹添加到更高的$PATH中,如下所示:

export PATH=$HOME/.cabal/bin:$PATH

这在我使用homebrew+mavericks上没有起作用。然而,这个答案起了作用。 - Sebastian Graf
@Sebastian - 对的 - 如果你直接从http://hackage.haskell.org/platform/使用软件包。Homebrew使用`$HOME/.cabal`和`/usr/local/bin`,而不是`/Library/Haskell/bin`。我现在意识到上面的解决方案回答了一个略微不同于OP所问的问题。 - Charles
这对我来说是个问题。 - Shon
那么...原始安装现在就变得过时了吗? - xji

19

我在OSX安装Haskell平台2012.4.0.0后遇到了类似的问题。当我运行cabal install cabal-install时,它以以下内容结束:

cabal: ../ghc-7.4.2/lib/cabal-install-1.16.0.2/bin/cabal: does not exist

所以我猜它在某个地方弄混了路径。不过可执行文件实际上是成功构建的(检查 ~/Library/Haskell/ghc-7.4.2/lib/cabal-install-1.16.0.2/bin/cabal),然后我只是将它从那里复制到了我的路径中的~/Library/Haskell/bin

此后一切都正常运行:

$ which cabal
/Users/luke/Library/Haskell/bin/cabal
$ cabal update
Downloading the latest package list from hackage.haskell.org
$ cabal --version
cabal-install version 1.16.0.2
using version 1.16.0.3 of the Cabal library

2
我的Windows系统也出现了类似的情况。每个用户的cabal安装目录位于%HOMEPATH%\AppData\Roaming\cabal\bin,因此需要将其作为更高优先级附加到路径中。 - Will Sewell

12

每个人似乎在这里都有略微不同的问题。在我的情况下,cabal 已成功构建并安装到 ~/Library/Haskell/bin

~/.cabal/config 中所述,将 ~/Library/Haskell/bin 添加到 PATH 中解决了该问题。

以下是 ~/.cabal/config 中的描述:

-- === Built executables will be installed in:
--     ~/Library/Haskell/bin
--
-- You may wish to place this on your PATH by adding the following
-- line to your ~/.bash_profile:
--     export PATH="$HOME/Library/Haskell/bin:$PATH"

在我看来,这是正确的方法。 - Sebastian Graf

10
在 OS X 10.8 上,我必须将 /Library/Haskell/bin 添加到我的 PATH 中(放在 /usr/bin 之前)。添加这个路径可以解决错误信息。

1
这是正确的。/usr/bin 中的旧版本遮盖了 /Library/Haskell/bin 中的版本。我会说这是相当混乱的安装过程... 他们为什么不直接替换 /usr/bin 中的旧版本呢? - xji

3

cabal --version命令可以告诉您当前正在使用的Cabal版本。如果想查看已安装的cabal-install版本,运行cabal info cabal-install并查看versions installed一行。

在我的OS X上,versions installed[unknown],即使我运行了cabal install cabal-install也是如此,这并不好。


可能是因为它不知道,所以总是告诉你要升级? - Luis Ortega Araneda
2
@LuisOrtegaAraneda 不是的,cabal二进制文件知道它的版本,只有在hackage上有更新版本时才会告诉你升级。可能新版本安装在不在你的路径中的目录里。使用的是哪个操作系统?在Linux(和OS X,如果我没记错的话),你应该将 $HOME/.cabal/bin 添加到你的路径中;在Windows上,类似于 Users\You\AppData\Roaming - Daniel Fischer
实际上,它不适用于该路径,在OS X中您必须使用/Library/Haskell/。当我运行cabal info cabal-install时,它显示为[unknown] - Luis Ortega Araneda

3

我也遇到了这个问题。

运行which cabal后,我发现它使用的是/usr/bin/cabal。删除它解决了这个问题。


1
在我的情况下,需要结合这里的几个答案才能解决这个问题。我将尝试为其他人提供更全面的解决方案。
首先,运行which cabal显示我正在加载/usr/bin/cabal,它是指向/Library/Haskell/ghc-7.8.3-x86_64/bin/cabal的符号链接。我相信新版本的cabal已经被安装了,但这个路径只适用于一个版本,所以它们被忽略了。在我的$PATH前面添加/Library/Haskell/bin解决了这个问题。
其次,更重要的是,新版本的cabal-install被安装到我的cabal沙盒而不是系统位置。我没有看到任何其他答案建议这样做,但经过一些调试,我发现移出应用程序目录可以让cabal实际上安装到系统中。
最后,添加--global标志到命令中修复了问题。我的最终命令是cabal install --global cabal-install。之后,我终于能够成功更新了。
如果您使用cabal沙盒,请将其移出项目目录并运行cabal install --global cabal-install。此外,像其他人建议的那样检查您的$PATH变量。

1
似乎cabal默认会为当前用户本地安装软件包,因此不会成为PATH的一部分。请查看Cabal文档 ,特别是1.2.1步骤,您可以更改配置以默认全局安装(不建议)。
我安装cabal的方式是cabal --global install cabal-install,但仍然遇到了路径问题,因为Haskell的默认安装将路径放置在以下顺序:C:\Program Files\Haskell Platform\2013.2.0.0\lib\extralibs\bin;C:\Program Files\Haskell Platform\2013.2.0.0\bin; 。其中第一个路径优先于第二个路径。带有--global标志的cabal已将二进制文件安装到C:\Program Files\Haskell\bin,但它不在我的路径中,必须在C:\Program Files\Haskell Platform\2013.2.0.0\lib\extralibs\bin路径之前添加。
摘自文档。
你必须将cabal.exe放在一个在你的%PATH%中的目录下,例如C:\Program Files\Haskell\bin。

0
在我的情况下,cabal 的新版本正在安装到我所在项目的 .cabal-sandbox 中。
例如,检查版本:
./.cabal-sandbox/bin/cabal --version

所以我需要在外部升级它。这是在OSX上进行的。


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