2011-11-01 37 views
34

ghc-pkg check會列出損壞的軟件包,以及它們爲什麼被破壞,這是相當不錯的。但據我所知,沒有自動化的方式來照顧那些破損的包裹。處理破損包裹的建議方法是什麼? (最好不要重新安裝GHC)ghc-pkg檢查記錄的修復問題

+0

這取決於你如何安裝你的軟件包...... – ivanm

回答

29

希望你有足夠的智慧來打破你的全局包數據庫。破損很容易意味着重新安裝GHC是必要的。因此,讓我們假設破壞僅限於用戶軟件包數據庫(用戶軟件包映射的全局數據包中可能包含一個或兩個軟件包除外)。如果只有幾包被打破,你可以通過註銷違規包解決您的設置,

$ ghc-pkg unregister --user borken 

會經常抱怨註銷博肯會破壞其他軟件包。無論您試圖立即取消註冊那些還是立即註銷borken並應對新破壞大多是一種選擇。 確保您只從用戶數據庫取消註冊數據包。如果事情不是太嚴峻,在註銷一些軟件包之後,ghc-pkg check將報告沒有更多的破損軟件包。
另一方面,如果很大一部分軟件包損壞,則可能會更容易完全擦除用戶db,$ rm -rf ~/.ghc/ghc-version/package.conf.d或其他操作系統上的等效軟件。

無論哪種方式,你都會丟失你仍然想使用的軟件包,所以你會嘗試重新安裝它們而不用重新打破任何東西。運行

$ cabal install world --dry-run 

將嘗試爲您使用cabal-install安裝的所有軟件包生成一致的安裝計劃。如果它沒有這樣做,它會打印出原因,然後你可以通過向世界文件(~/.cabal/world)中列出的包添加約束來解決問題 - 例如,儘管我沒有破包(根據ghc/ghc-pkg),cabal install world --dry-run告訴我它不能配置vector-algorithms-0.5.2,這取決於vector >= 0.6 && < 0.8(我已安裝vector-0.7.1)。原因是hmatrix-0.12.0.1要求vector >= 0.8。在世界文件中將hmatrix上的-any「約束」替換爲「< 0.12」產生了一個乾淨的安裝計劃。
因此,在世界文件中有一些約束條件之後,你會從cabal得到一個安裝計劃。檢查是否會重新安裝已有的軟件包(安裝較新的版本可能不錯,重新安裝相同的版本意味着麻煩)。如果您對cabal的安裝計劃cabal install world感到滿意,並且在GHC忙時沏出一壺好茶。再次運行ghc-pkg check,驗證一切正常。

一個普遍好的建議:如果你不知道安裝軟件包需要什麼,總是首先使用--dry-run。

如果您通過使用cabal進行全局安裝來破壞您的全局包數據庫,那麼註銷違規者的策略可能會奏效,但它也可能會不可逆轉地破壞您的ghc,這取決於哪種方式被破壞。如果你通過從你的操作系統發行版安裝軟件包來破壞你的全局數據庫,那麼安裝一個新的GHC,詛咒發行版打包者,並試圖幫助他們防止進一步發生這樣的事件。

A cabal repair命令將是非常好的,但目前,修復損壞的設置不幸的是更多的工作。

+0

全局包數據庫被破壞了什麼問題?如果您在系統範圍內安裝軟件包(無論是由於軟件包管理器還是因爲您在管理多個人的機器並因此在全球範圍內安裝軟件包),那麼這只是解決它的問題。雖然它**是一個問題,當一個啓動包打破... – ivanm

+0

是的,如果沒有啓動包被影響,沒有太大的區別,只有你可以完全擦拭用戶數據庫,並仍然/再次有一個工作GHC。但我的印象是,不幸的是,啓動包經常受到影響,所以......如果您要全球安裝,請格外小心。 –

+0

好吧,如果你使用cabal-install,那麼啓動包會受到影響......但是使用發行包管理器,這應該不成問題。 – ivanm

15

有一段時間我依靠這個ghc-pkg-clean script。它刪除所有破損的包,並根據需要重新安裝它們。對於更嚴重的破損,我使用ghc-pkg-reset script

但是,今天我發現了ghc-pkg-autofix,它使得這個進一步自動化 - 破碎的軟件包變得不間斷。我不知道它是什麼,YMMV。

+4

通過描述和對源代碼的簡要介紹,'ghc-pkg-autofix'重寫了'〜/ .ghc /.../ package.conf.d/package'中的依賴信息。這是一項危險的操作,可能會以陰險的方式破壞事物,但它在哪裏運作,速度很快。正如該描述所說的那樣,_使用風險自負。你的腳本看起來更安全。但是如果你和我一樣,並且安裝了多個GHC,那麼ghc-pkg-clean只處理鏈接到ghc的腳本(容易修改腳本以接受使用ghc-pkg的參數)和ghc-pkg-reset會把它們全部燒掉。所以,不適合我,但我很奇怪。 +1用於自動幫助。 –