干净安装“ 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 Cabal感到困惑,总是认为它不是最新的,因为它正在看第一个?

ghc-pkg check 找不到错误。

有帮助吗?

解决方案 3

我将描述迄今为止对我有效的工作。我已经尝试了许多不同的事情,但是我只在这里描述了有效的尝试。

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

  • 我从源安装了GHC 6.12.3。不要删除您以前的GHC,因为建筑GHC需要它。
  • 我删除了符号链接 /usr/bin (为了 ghc, ghci, ghc-pkg, , 和 runhaskell)到我以前的GHC,这是Haskell Platform 2010.1.0.1安装程序的GHC。
  • 我安装了 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 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。但是谁知道,也许那时将是一个较旧的版本,随着攻击软件包的更新以解决依赖关系问题,它将变得稳定。作为对您的服务,我将更新此问题,并在时间到来时回答。 (假设其他人也遇到了这个问题。到目前为止,我证实了Simon Marlow和Peaker也面临这个问题)

  • 知道您的haskell设置被打破的方法(如果这些设置为true,则该设置被打破了):

    • 没有什么可用
    • ghc-pkg check 说它坏了
    • 我在上面放置此答案的简短程序发现您已安装了两次包装的包装,与完全相同的版本
    • cabal update 然后循环 cabal install在上面写的包装列表或另一个列表(最好是具有很多依赖项的大包装列表)。如果您从未达到稳定的状态(周期的迭代总是重新安装某些东西),那么您的设置就会破坏。 警告: :此步骤可能会破坏您当前运行的Haskell设置。如果您很有趣或愿意修复设置后,请执行此操作(这可能很耗时)
  • 我想知道您的设置是否破坏还是工作。这可以帮助我。例如,如果我们发现GHC 6.10设置工作正常,则我可以在向某人推荐Haskell等的情况下向人们推荐这些设置。

我希望这有助于其他人面临相同或相似问题的人。非常感谢西蒙·马洛(Simon Marlow)和约翰(John)!

其他提示

请这样做

ghc-pkg check

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

ghc-pkg list -v

cabal install random -v

编辑: :我可以使用GHC 6.12.1复制您的问题,但可以使用6.12.2,使用Cabal-Anstall(0.8.0)的版本完全相同。我会研究它。

编辑2: 报告为错误 在Cabal-install中。

我有两种可能的解决方案,这两种解决方案都有些危险,但应该为您提供工作安装。我很高兴西蒙(Simon)遵循这一点,因为对我来说这听起来像是某种错误。要获得工作安装,我将首先尝试以下内容:

ghc-pkg unregister random

然后,随机执行GHC-PKG列表以查看已安装的内容。我猜(但我不确定)您仍然拥有 / /库 /框架版本(来自平台),但新安装的版本将消失。如果是这种情况,请继续下一步。如果不是,您可能需要对平台进行干净的重新安装。

假设平台随机存在,请执行此操作:

cabal unpack random

CD到目录中,将其拆箱并通过将版本撞到1.0.0.2.1(添加另一个字段并将其递增)来编辑.Cabal文件。然后从该目录中安装Cabal,它应该安装新的随机。由于它的版本与平台随机不同,因此两者可以安全地共存。

您可以将注册文件直接从

/USERS/YAIRC/.ghc/i386-darwin-6.12.1/package.conf.d

该文件名称将附加一个哈希,因此您需要查看目录内容以实际获取该值。只需删除文件,GHC-PKG和Cabal就不应该从那时看到它。这不会触及平台的安装(从这个意义上讲,它更安全),但是潜力仍然是软管其他安装的软件包。之后,您可以通过解开包装和上述版本来重新安装随机软件包。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top