2010-06-25 147 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