9

全新安装“Haskell 平台”。(OS X Snow-Leopard & Platform 2010.1.0.1),这样做会导致简单的序列导致非常奇怪的cabal install行为:

$ cabal install time

$ cabal install random

$ ghc-pkg list random
/Library/Frameworks/GHC.framework/Versions/612/usr/lib/ghc-6.12.1/package.conf.d
   random-1.0.0.2
/Users/yairc/.ghc/i386-darwin-6.12.1/package.conf.d
   random-1.0.0.2

random-1.0.0.2在我的系统中安装了两次。现在每次都cabal install random重新安装。random-1.0.0.2

看起来像random取决于time,并且 cabal 想要在有新版本time可用后重新安装它?并且因为两个random-1.0.0.2阴谋集团感到困惑并且总是认为它不是最新的,因为它正在查看第一个?

ghc-pkg check没有发现错误。

4

3 回答 3

6

请做

ghc-pkg check

如果没有显示错误,让我们看看输出

ghc-pkg list -v

cabal install random -v

编辑:我可以使用完全相同版本的 cabal-install (0.8.0) 重现 GHC 6.12.1 的问题,但不能重现 6.12.2 的问题。我会调查的。

编辑 2报告为cabal-install 中的错误。

于 2010-06-25T19:43:35.440 回答
2

我有两种可能的解决方案,它们都有点危险,但应该可以让你安装。我很高兴西蒙关注这个,因为这对我来说听起来像是某种错误。要获得有效的安装,我将首先尝试以下操作:

ghc-pkg unregister random

然后执行 ghc-pkg list random 以查看已安装的内容。我猜想(但我不确定)您仍然会拥有 /Library/Frameworks 版本(来自平台),但新安装的版本将会消失。如果是这种情况,请继续执行下一步。如果不是,您可能需要重新安装平台。

假设平台 random 仍然存在,请执行以下操作:

cabal unpack random

cd 到它解压到的目录,然后通过将版本提升到 1.0.0.2.1 来编辑 .cabal 文件(添加另一个字段并将其递增一)。然后 cabal 从该目录安装,它应该安装新的随机数。由于这与平台随机具有不同的版本,因此两者可以安全地共存。

而不是做 ghc-pkg 注销,您可以直接删除注册文件

/Users/yairc/.ghc/i386-darwin-6.12.1/package.conf.d

文件名将附加一个哈希,因此您需要查看目录内容才能实际获取该值。只需删除该文件,然后 ghc-pkg 和 cabal 就不会再看到它了。这不会触及平台安装(因此从这个意义上说它更安全),但仍有可能对其他已安装的软件包进行软管处理。在此之后,您可以通过解包和增加版本来重新安装随机包。

于 2010-06-25T21:14:21.213 回答
2

我将描述迄今为止对我有用的解决方法。我尝试了很多不同的东西,但我只会在这里描述有效的尝试。

(顺便说一句:我使用的是 Mac OS X 10.6.4,您的结果在不同系统上可能会有所不同)

  • 我从源代码安装了 GHC 6.12.3。不要删除您以前的 GHC,因为构建 GHC 需要它。
  • 我删除了/usr/bin(for ghc, ghci, ghc-pkg, and runhaskell) 的符号链接到我以前的 GHC,它是来自 Haskell Platform 2010.1.0.1 安装程序的那个。
  • cabal-install使用它的bootstrap.sh脚本安装。
  • random我安装了和haskell98包的补丁版本。差异只是在他们的.cabal文件 中
    • random的版本升级到1.0.0.2.1并将其依赖更改timetime == 1.1.*
    • bumpedhaskell98的版本最多1.0.1.1.1就是这样
  • 我跑过去看看哪些包已经过时了cabal updatecabal upgrade我做了cabal install那些。我相信这有助于更快地达到稳定状态。(请注意,syb安装失败,并且cabal install parsec如果说不同的话,就没有什么可做的了cabal upgrade。所以我把这两个包单独留下了)

ghc-pkg check我通过在各个阶段之间运行来验证我的设置是否正常。有时它会中断,因为一个包被重新安装在具有相同版本号的先前版本上,并且依赖于它的包需要重新安装。当这种情况发生时,我cabal install再次损坏了包裹。

我还使用以下程序来验证我的设置不包含两个具有相同版本的包:

import Data.List (sort)
import Data.Maybe (fromJust)
import System.IO (hGetContents)
import System.Process (CreateProcess (std_out), StdStream (CreatePipe), createProcess, shell)

main :: IO ()
main = do
    pkgListRaw <-
        createProcess (shell "ghc-pkg list") { std_out = CreatePipe }
        >>= hGetContents . fromJust . sndOfFourTup
    let pkgListSorted = sort . filter (not . null) $ lines pkgListRaw
    putStrLn .
        unlines . map (dropWhile (== ' ') . fst) .
        filter (uncurry (==)) . zip pkgListSorted $ tail pkgListSorted
    where
        sndOfFourTup (_, x, _, _) = x
  • cabal install编辑了hlint, yesod, haddock, HDBC-mysql,hakyll和其他软件包,然后我cabal install一次又一次地编辑了前面的列表,直到我的设置达到“稳定状态”,在这种状态下cabal install不会重新安装任何这些。

  • 我验证了我正在处理的我自己的程序现在可以编译和工作。现在一切似乎都很好

笔记:

  • 我无法让 Haskell Platform 2010.1.0.1 工作。在我升级到 GHC 6.12.3 后,事情才对我有用。具有讽刺意味的是(?),这违背了 GHC 下载页面上的建议:

停止!

对于大多数用户,我们建议安装 Haskell 平台而不是 GHC。当前的 Haskell 平台版本包括最近的 GHC 版本以及一些其他工具(例如 cabal),以及一组已知可以协同工作的更大的库。

  • 这种解决方法也可能在未来的某个时候中断。我想这可能会在几个月内发生。像这样的核心库random将得到更新,然后依赖性问题将再次开始解决。然后我/你将不得不花时间修复我们的设置。也许那时它需要升级到更新的 GHC。但是谁知道呢,也许它会是一个较旧的版本,随着 hackage 包的更新以解决依赖相关的问题,它会变得稳定。作为对您的服务,我会在时机成熟时更新这个问题和答案。(假设其他人也有这个问题。到目前为止,我验证了 Simon Marlow 和 Peaker 也面临这个问题)

  • 知道您的 Haskell 设置已损坏的方法(如果其中任何一个为真,则设置已损坏):

    • 没有任何效果
    • ghc-pkg check说它坏了
    • 我在上面这个答案中输入的源代码的短程序发现您安装了两次完全相同版本的软件包
    • cabal update然后循环cabal install我上面写的包列表,或者另一个列表(最好是一个有很多依赖项的大列表)。如果您从未达到稳定状态(循环的迭代总是会重新安装某些东西),那么您的设置就会被破坏。警告:此步骤可能会破坏您当前正常运行的 Haskell 设置。如果您非常好奇或愿意在设置中断后修复设置(这个过程可能很耗时),请执行此操作
  • 我想知道您的设置是否损坏或正常工作。这可以帮助我。例如,如果我们发现 GHC 6.10 设置工作正常,I/U 可以在向某人推荐试用 Haskell 等时向人们推荐这些设置。

我希望这可以帮助其他面临相同或类似问题的人。非常感谢西蒙·马洛和约翰!

于 2010-06-26T12:01:19.020 回答