【问题标题】:mysterious cabal-install problems神秘的阴谋集团安装问题
【发布时间】:2010-06-25 16:40:37
【问题描述】:

全新安装“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 可用后重新安装它?并且因为两个random-1.0.0.2 cabal 很困惑,总是认为它不是最新的,因为它正在查看第一个?

ghc-pkg check 没有发现错误。

【问题讨论】:

    标签: haskell cabal hackage cabal-install


    【解决方案1】:

    请做

    ghc-pkg check
    

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

    ghc-pkg list -v
    

    cabal install random -v
    

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

    编辑 2reported as a bug 在 cabal-install 中。

    【讨论】:

    • 感谢您的光临! :) 我已将这些命令的输出添加到我的问题中
    【解决方案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 unregister,可以直接删除注册文件

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

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

    【讨论】:

    • 我尝试了类似的方法,起初它奏效了。我修补了randomhaskell98,我目前正在处理的项目运行良好。我决定通过cabal installhlinthoogledarcsHDBC-mysqlauthenticatehakyll 进行更精细的检查,并重复该过程以验证我是否达到了一个固定点.最后,Haskell 平台中 GHC 安装程序附带的几乎每个软件包都存在问题。我的下一个尝试是禁用 cabal 的 user-install 选项。
    • 经过几次迭代的变通尝试,我认为我的设置终于奏效了!我在下面的回答中描述了我的解决方法。谢谢!
    【解决方案3】:

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

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

    • 我从源代码安装了 GHC 6.12.3。不要删除您以前的 GHC,因为构建 GHC 需要它。
    • 我删除了 /usr/bin 的符号链接(对于 ghcghcighc-pkgrunhaskell)到我以前的 GHC,它是来自 Haskell Platform 2010.1.0.1 安装程序的那个。
    • 我使用bootstrap.sh 脚​​本安装了cabal-install
    • 我安装了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 installed hlint, yesod, haddock, HDBC-mysql, hakyll 和其他软件包,然后我 cabal installed 之前的列表一次又一次,直到我的设置达到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 installing 我上面写的包列表,或者另一个列表(最好是一个有很多依赖项的大列表)。如果您从未达到稳定状态(循环的迭代总是会重新安装某些东西),那么您的设置就会被破坏。 警告:此步骤可能会破坏您当前正常运行的 Haskell 设置。如果您非常好奇或愿意在设置中断后修复设置(此过程可能很耗时),请执行此操作
    • 我想知道您的设置是否损坏或正常工作。这可以帮助我。例如,如果我们发现 GHC 6.10 设置运行良好,I/U 可以在向他人推荐 Haskell 等时向人们推荐这些设置。

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

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多