2010-06-25 141 views
9

随着“Haskell平台”的干净安装。 (OS X雪豹&平台2010.1.0.1),这样做会导致简单的序列会导致非常奇怪的行为cabal install神秘的cabal安装问题

$ 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 cabal感到困惑,并且总是认为它不是最新的,因为它正在查看第一个?

ghc-pkg check找不到任何错误。

回答

2

我将描述到目前为止对我工作的解决方法。我已经尝试了很多不同的东西,但我只会在这里描述一下工作的尝试。

(顺便说一句:我使用的是Mac OS X 10.6.4和你的结果可能是在不同的系统不同)

  • 我从源代码安装GHC 6.12.3。不要删除您之前的GHC,因为GHC需要它。
  • 我删除了符号链接在/usr/bin(为ghcghcighc-pkgrunhaskell)我以前的GHC这是从哈斯克尔平台2010.1.0.1安装程序中的一个。
  • 我安装了cabal-install使用它的bootstrap.sh脚本。
  • 我安装了randomhaskell98程序包的修补版本。差异只是在他们.cabal文件
    • 撞到random的版本升级到1.0.0.2.1,改变依赖IT上timetime == 1.1.*
    • 撞到haskell98的版本到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 installhlintyesodhaddockHDBC-mysqlhakyll等包,然后我cabal install一次又一次地编辑以前的列表,直到我的设置达到“稳定状态”,其中cabal install不重新安装任何这些。

  • 我验证了自己正在编写的程序现在正在编译和工作。一切似乎要被罚款,现在

注:

  • 我不能让哈斯克尔平台2010.1.0.1工作。在我升级到GHC 6.12.3后,事情只对我有效。具有讽刺意味的是,这违背了GHC下载页面上的建议:

停止!

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

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

  • 如何知道你的Haskell设置是否被破坏(如果其中任何一个是真的,那么设置被破坏):

    • 没有什么工作
    • ghc-pkg check说,这是打破
    • 短节目的源,我把这个答案上面发现你有完全相同的版本
    • 012安装两次包,然后循环cabal install上面我写的软件包列表,或者另一个列表(最好是有很多依赖关系的大软件包)。如果你永远不会达到稳定状态(循环的一次迭代总是重新安装某些东西),那么你的设置就会被破坏。 警告:此步骤可能会破坏您当前正在运行的Haskell设置。这样做,如果你是马索好奇或愿意解决你的设置它打破后(这个过程可能是费时)
  • 我想知道您是否设置被破坏或工作。这可以帮助我。例如,如果我们发现GHC 6.10设置工作正常,我/ U可以推荐的这些设置中人们对建议的人来尝试哈斯克尔等

我希望这可以帮助别人面对之际相同或相似的问题。非常感谢Simon Marlow和John!

6

请不要

ghc-pkg check 

,如果显示没有错误,让我们来看看从

ghc-pkg list -v 

cabal install random -v 

编辑输出:我可以重现你的问题GHC 6.12.1,而不是6.12.2,使用完全相同的版本离子的安装(0.8.0)。我会研究它。

编辑2reported as a bug in cabal-install。

+0

感谢您的参与! :)我已经添加了这些命令的输出到我的问题 – yairchu 2010-06-25 20:35:19

2

我有两种可能的解决方案,这两种方法都有些危险,但应该让你有一个安装工作​​。我很高兴西蒙继续这样做,因为它听起来像是我的一种错误。要获得工作安装,我会尝试以下第一个:

ghc-pkg unregister random 

然后做ghc-pkg列表随机看看是什么安装。我猜(但我不确定)你是否仍然拥有/ Library/Frameworks版本(来自平台),但新安装的版本将不复存在。如果是这种情况,请继续下一步。如果不是,您可能需要重新安装平台。

假设平台随机仍然存在,这样做:

cabal unpack random 

cd到它解压缩到目录中,并通过碰撞的版本1.0.0.2.1编辑.cabal文件(添加一个字段并增加1)。然后cabal从该目录安装,它应该安装新的随机。由于这个版本与平台随机版本不同,两者可以安全地共存。

,而不是做的GHC-PKG注销,您可以直接从

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

删除注册文件

文件名将附加一个散列,因此您需要查看目录内容以真正获取该值。只要删除文件,ghc-pkg和cabal就不应该再看到它了。这不会触及平台安装(所以它在这个意义上更安全),但是仍然有潜力用于软管其他安装的软件包。在此之后,您可以重新安装随机软件包,方法是按上述方式解压缩和增加版本。

+0

我尝试了类似的东西,起初它的工作。我修补了'random'和'haskell98',我目前正在开发的项目工作得很好。我决定做一个更精细的检查,通过cabal安装'hlint','hoogle','darcs','HDBC-mysql','authenticate','hakyll'并重复这个过程来验证我到达一个固定点。最后,Haskell平台中几乎每一个与GHC安装程序一起提供的软件包都存在问题..我的下一个尝试是禁用cabal的'user-install'选项。 – yairchu 2010-06-25 23:01:07

+0

之后的几次迭代尝试,我认为我的设置终于起作用了!我在下面的答案中描述了我的解决方法。谢谢! – yairchu 2010-06-26 12:03:16