神秘的cabal-install问题

时间:2010-06-25 16:40:38

标签: haskell cabal hackage cabal-install

干净安装“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,并且在新版time可用后,cabal想要重新安装它?而且由于两个random-1.0.0.2阴谋混淆并且总是认为它不是最新的,因为它正在看第一个?

ghc-pkg check发现没有错误。

3 个答案:

答案 0 :(得分:6)

请做

ghc-pkg check

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

的输出
ghc-pkg list -v

cabal install random -v

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

在cabal-install中

编辑2 reported as a bug

答案 1 :(得分: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从那时起就不应该看到它。这不会触及平台安装(因此在这个意义上它更安全),但仍有可能软管其他已安装的软件包。在此之后,您可以通过解压缩并按上述方式递增版本来重新安装随机包。

答案 2 :(得分:2)

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

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

  • 我从源代码安装了GHC 6.12.3。不要因为建筑GHC要求而移除您以前的GHC。
  • 我删除了/usr/binghcghcighc-pkgrunhaskell)的符号链接到我以前的GHC中的符号链接Haskell Platform 2010.1.0.1安装程序。
  • 我使用cabal-install脚本安装了bootstrap.sh
  • 我安装了randomhaskell98软件包的修补版本。差异仅在于.cabal个文件中
    • random的版本提升至1.0.0.2.1,并将其对time的依赖关系更改为time == 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 install ed hlintyesodhaddockHDBC-mysqlhakyll和其他包,然后我{{{ 1}}重复上一个列表,直到我的设置达到“稳定状态”,其中cabal install不会重新安装任何这些。

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

注意:

  • 我无法使Haskell Platform 2010.1.0.1正常运行。在升级到GHC 6.12.3后,事情对我有用。具有讽刺意味的是(?),这违反了GHC下载页面上的建议:
  

停止!

     

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

  • 这种解决方法也可能在未来的某个时间打破。我猜这可能会在几个月内发生。像cabal install这样的核心库将得到更新,然后依赖性问题将再次开始解体。然后我/你将不得不花时间修复我们的设置。也许那时需要升级到更新的GHC。但谁知道,也许随后它会变得更稳定,因为hackage包会更新以解决与依赖相关的问题。作为对您的服务,我会在时机成熟时更新此问题并回答。 (假设其他人也遇到了这个问题。到目前为止,我确认Simon Marlow和Peaker也面临这个问题)

  • 如何知道您的Haskell设置已损坏(如果其中任何一个都是真的那么设置被破坏):

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

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