2012-01-10 78 views
5

我發現cabal的軟件包瘋狂時的行爲。例如,運行「cabal install ___」中斷了以前安裝的軟件包

cabal install funsat 

安裝舊版本的arraytimerandomquickcheckbitset,破包,比如monadiccphoogleheistsnap

它的工作原理回去cabal install monadiccp等等,但是我怎樣才能避免cabal破壞安裝包的默認行爲?任何合理的Linux軟件包管理器(如​​或zypper要求是否在安裝新軟件包時是否打算安裝已安裝的軟件包。

有沒有人制作了解決方法腳本?提前致謝。

+1

http://ivanmiljenovic.wordpress.com/2010/03/15/repeat-after-me-cabal-is-not-a-package-manager/ – 2012-01-10 05:51:50

+0

@ MatveyB.Aksenov,我(a)cabal/= cabal-install,我已經知道但不太在乎(b)如果你沒有系統軟件包,請使用系統軟件包管理器(c),切換到gentoo。 (c)對我來說不是一個真正的選擇,不幸的是。 – gatoatigrado 2012-01-10 18:07:22

回答

8

我推薦cabal-dev,它爲您工作的每個項目維護一套獨立的已安裝軟件包。這並不能解決一般情況下cabal-install的不良行爲,但意味着此類故障比其他情況更加孤立,並允許您通過簡單地執行cabal-dev clean && cabal-dev install來更輕鬆地修復它們。

可重複構建的附加好處也很好。

無可否認,這不是解決您的特定問題的方法,但它通常可以減輕陰莖痛苦。


丹尼爾·費舍爾的回答大廈,這裏是爲cabal一個包裝,中止安裝是否會重新安裝包:

cabal() { 
    if [ "$1" = "install" ]; then 
    local out=$(command cabal --dry-run -v2 "[email protected]" 2>&1) 
    if echo "$out" | egrep -c '\((reinstall|new version)\)' >/dev/null; then 
     echo "$out" 
     return 1 
    fi 
    fi 
    command cabal "[email protected]" 
} 

因人而異;我只輕描淡寫地測試了這一點,並且它在啓動時會引起惱人的延遲,因爲所有的依賴性必須計算兩次。但是如果你想保持安全的話,它應該可以緩解一些乏味。

+0

+1我不知道這個,謝謝......我想這應該是Python的virtualenv的Haskell equiv。 – 2012-01-10 03:59:04

+0

太好了,不過對於zsh,刪除本地(並且添加提醒如何安裝 - http://pastebin.com/PGYWqdKA)。它似乎適用於funsat示例(停止安裝),並允許安裝「repa」,但不會破壞任何內容。那謝謝啦!! – gatoatigrado 2012-01-10 18:21:33

+0

也很瞭解'command',現在我可以拿出幾個其他shell函數的黑客了。 – gatoatigrado 2012-01-10 18:21:55

5

解決方法:首先總是使用--dry-run進行檢查。如果cabal會重新安裝任何包裝,請小心。

2

這是一個已知問題(請參閱this slide deck,從幻燈片22開始)。 Darcs版本cabal-installdarcs get http://darcs.haskell.org/cabal)現在在安裝軟件包時會顯示一條警告信息,會破壞您的系統。例如:

$ cabal --version 
cabal-install version 0.13.3 
using version 1.13.3 of the Cabal library 
$ cabal install monadiccp 
[...] 
$ cabal install funsat 
Resolving dependencies... 
In order, the following would be installed: 
mtl-1.1.1.1 (new version) 
syb-0.3.6 (new package) 
array-0.2.0.0 (new version) 
containers-0.2.0.1 (new version) 
bimap-0.2.4 (new package) 
deepseq-1.2.0.1 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0 
fgl-5.4.2.2 (new package) 
text-0.11.1.12 (reinstall) changes: array-0.3.0.2 -> 0.2.0.0 
parsec-3.1.2 (reinstall) changes: mtl-2.0.1.0 -> 1.1.1.1 
parse-dimacs-1.2 (new package) 
time-1.1.4 (new version) 
random-1.0.0.3 (reinstall) changes: time-1.2.0.3 -> 1.1.4 
QuickCheck-1.2.0.1 -base3 (new package) 
bitset-0.6 (new package) 
funsat-0.6.1 (new package) 
cabal: The install plan contains reinstalls which can break your GHC 
installation. 
You can use the --avoid-reinstalls option to try to avoid this or try 
to ghc-pkg unregister the version of the package version to see its effect 
on reverse dependencies. If you know what you are doing you can use 
the --override-reinstall-check option to override this reinstall check.