簡體   English   中英

神秘的cabal-install問題

[英]mysterious cabal-install problems

干凈安裝“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沒有發現錯誤。

請做

ghc-pkg check

如果沒有顯示錯誤,讓我們看看輸出

ghc-pkg list -v

cabal install random -v

編輯 :我可以使用GHC 6.12.1重現您的問題,但不能使用6.12.2,使用完全相同的cabal-install版本(0.8.0)。 我會調查一下。

編輯2報告為 cabal-install中的錯誤

我有兩個可能的解決方案,這兩個解決方案都有點危險,但應該讓你安裝工作。 我很高興西蒙跟着這個,因為這聽起來像是某種蟲子。 要獲得有效的安裝,我首先嘗試以下方法:

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從那時起就不應該看到它。 這不會觸及平台安裝(因此在這個意義上它更安全),但仍有可能軟管其他已安裝的軟件包。 在此之后,您可以通過解壓縮並按上述方式遞增版本來重新安裝隨機包。

我將描述迄今為止對我有用的解決方法。 我嘗試了很多不同的東西,但我只會在這里描述有效的嘗試。

(順便說一句:我使用的是Mac OS X 10.6.4,你的結果在不同系統上可能會有所不同)

  • 我從源代碼安裝了GHC 6.12.3。 不要移除您以前的GHC,因為建築GHC需要它。
  • 我刪除了/usr/bin (對於ghcghcighc-pkgrunhaskell )的符號鏈接到我以前的GHC,這是來自Haskell Platform 2010.1.0.1安裝程序的GHC。
  • 我使用它的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 install ed hlintyesodhaddockyesod HDBC-mysqlhakyll和其他軟件包然后我cabal install ed前一個列表一次又一次,直到我的設置達到“穩定狀態”,其中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 install我上面寫的包列表,或另一個列表(最好是一個有很多依賴的大的列表)。 如果你從未達到穩定狀態(循環的迭代總是重新安裝某些東西),那么你的設置就會被破壞。 警告 :此步驟可能會破壞當前正在運行的Haskell設置。 如果你是好奇或願意在它破裂后修復你的設置(這個過程可能很耗時),請這樣做
  • 我想知道您的設置是否已損壞或正常工作。 這可以幫助我。 例如,如果我們發現GHC 6.10設置工作正常,I / U可以在推薦給某人試用Haskell等時向人們推薦這些設置。

我希望這有助於其他人面臨相同或類似的問題。 非常感謝Simon Marlow和John!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM