2012-05-14 12 views
77

Happstack Lite đang phá vỡ tôi vì nó nhận được blaze-html phiên bản 0.5 và nó muốn phiên bản 0.4. Cabal nói rằng cả hai phiên bản 0.4.3.4 và 0.5.0.0 được cài đặt. Tôi muốn xóa 0.5.0.0 và chỉ sử dụng phiên bản cũ hơn. Nhưng cabal không có lệnh "uninstall" và khi tôi thử ghc-pkg unregister --force blaze-html, ghc-pkg nói lệnh của tôi đã bị bỏ qua.Tôi làm cách nào để gỡ cài đặt phiên bản của gói Cabal?

Tôi phải làm gì?

CẬP NHẬT: Đừng tin điều đó. Mặc dù ghc-pkg xác nhận quyền sở hữu để bỏ qua lệnh, lệnh không bị bỏ qua. Và với câu trả lời được chấp nhận của Don Stewart, bạn có thể loại bỏ chính xác phiên bản bạn muốn loại bỏ.

+2

'danh sách ghc-pkg blaze-html'? Bạn có chắc là bạn đang chạy nó với tư cách là người dùng đúng không? Có thể tuyên bố rõ ràng phiên bản không được đăng ký? – ivanm

+1

@ivanm cảm ơn vì đã hỏi. Hóa ra 'ghc-pkg' * nói dối * với tôi! –

+0

Sắp xếp một bản sao của http://stackoverflow.com/questions/7252193/can-cabal-not-un-install-packages, nhưng tôi miễn cưỡng gắn cờ vì điều này tốt hơn :) –

Trả lời

89

Bạn có thể ghc-pkg unregister một phiên bản cụ thể, như vậy:

$ ghc-pkg unregister --force regex-compat-0.95.1 

Đó nên là đủ.

+17

một khi chưa đăng ký, có bất kỳ tập tin nằm xung quanh một nơi nào đó mà nên được cắt tỉa? –

+0

Nhận xét về các địa điểm khác đề cập đến việc ghc-pkg để lại các thư mục xung quanh? – CMCDragonkai

+0

có một cái nhìn trong thư mục '~/.cabal /' của bạn để biết thông tin về nơi pkgs và nhị phân là – Leahcim

6

Đây là tập lệnh trình bao mà tôi sử dụng để gỡ cài đặt gói. Nó hỗ trợ nhiều phiên bản cài đặt của GHC và cũng sẽ xóa sạch file liên quan (nhưng được cung cấp mà không cần bảo hành, đừng đổ lỗi cho tôi nếu bạn vòi cài đặt của bạn!)

#!/bin/bash -eu 
# Usage: ./uninstall.sh [--force | --no-unregister] pkgname-version 

# if you set VER in the environment to e.g. "-7.0.1" you can use 
# the ghc-pkg associated with a different GHC version 
: ${VER:=} 

if [ "$#" -lt 1 ] 
then 
     echo "Usage: $0 [--force | --no-unregister] pkgname-version" 
     exit 1 
fi 

if [ "$1" == "--force" ] 
then force=--force; shift; # passed to ghc-pkg unregister 
else force= 
fi 

if [ "$1" == "--no-unregister" ] 
then shift # skip unregistering and just delete files 
else 
     if [ "$(ghc-pkg$VER latest $1)" != "$1" ] 
     then 
       # full version not specified: list options and exit 
       ghc-pkg$VER list $1; exit 1 
     fi 
     ghc-pkg$VER unregister $force $1 
fi 

# wipe library files 
rm -rfv -- ~/.cabal/lib/$1/ghc-$(ghc$VER --numeric-version)/ 

# if the directory is left empty, i.e. not on any other GHC version 
if rmdir -- ~/.cabal/lib/$1 
then rm -rfv -- ~/.cabal/share/{,doc/}$1 # then wipe the shared files as well 
fi 
+1

Tôi vừa thử điều này trên Mac và dường như nó không hoạt động. – pyrrhic

20

Ngoài ra còn có các gói cabal-uninstall mà cung cấp một lệnh cabal-uninstall. Nó hủy đăng ký gói và xóa thư mục. Nó là đáng nói đến mặc dù nó vượt qua --force đến ghc-pkg unregister để nó có thể phá vỡ các gói khác.

+1

'cabal uninstall' kết quả trong' cabal: unrecognized command: uninstall (try --help) ' –

+2

@StevenShaw - Liên kết mà tôi cung cấp đến gói hackage mà bạn cần cài đặt để sử dụng.Tôi muốn giới thiệu câu trả lời của Don, đó là những gì tôi sử dụng. – Davorak

+0

Còn về [cabal-delete] (https://github.com/iquiw/cabal-delete) từ một bình luận ở trên bởi @Tobu? Có tốt hơn hoặc mạnh hơn cài đặt cabal không? –

23

Nếu bạn ở ngoài một sandbox:

ghc-pkg unregister --force regex-compat-0.95.1 

Nếu bạn đang ở trong một cabal sandbox:

cabal sandbox hc-pkg -- unregister attoparsec --force 

Đầu tiên -- là tách lập luận cho hc-pkg. Điều này chạy ghc-pkg theo cách nhận biết sandbox.