2012-01-10 41 views
5

Tôi tìm thấy hành vi của cabal khi cài đặt các gói bị làm phiền. Ví dụ, chạy"cabal install ___" ngắt các gói đã cài đặt trước

cabal install funsat 

cài đặt phiên bản cũ của array, time, random, quickcheck, và bitset, phá vỡ các gói như monadiccp, hoogle, heist, snap vv

Nó hoạt động để quay trở lại và cabal install monadiccp , v.v., nhưng làm cách nào tôi có thể tránh được hành vi mặc định của các gói đã cài đặt bị phá vỡ cabal? Bất kỳ trình quản lý gói Linux hợp lý nào, chẳng hạn như aptitude hoặc zypper sẽ yêu cầu cho dù tôi muốn ngắt các gói đã cài đặt, khi cài đặt gói mới.

Có ai đã nấu một tập lệnh giải pháp không? Cảm ơn trước.

+1

http://ivanmiljenovic.wordpress.com/2010/03/15/repeat-after-me-cabal-is-not-a-package-manager/ –

+0

@ MatveyB.Aksenov, những gì tôi nhận được từ trang đó là (a) cabal/= cabal-install, tôi đã biết nhưng không quan tâm nhiều lắm (b) sử dụng trình quản lý gói hệ thống (c) nếu bạn không có gói hệ thống, chuyển sang gentoo. (c) không thực sự là một lựa chọn cho tôi, thật không may. – gatoatigrado

Trả lời

8

Tôi khuyên bạn nên cabal-dev, trong đó duy trì một bộ gói cài đặt riêng biệt cho từng dự án bạn làm việc. Điều đó không giải quyết được hành vi xấu của cài đặt cabal nói chung, nhưng có nghĩa là những thất bại như vậy sẽ bị cô lập nhiều hơn so với nếu không, và cho phép bạn sửa chúng dễ dàng hơn bằng cách chỉ cần thực hiện cabal-dev clean && cabal-dev install.

Lợi ích bổ sung của các bản dựng lại có thể tái tạo cũng tốt.

Phải thừa nhận rằng đây không phải là giải pháp cho vấn đề cụ thể của bạn, nhưng nó sẽ làm giảm đau do cài đặt chung.


Xây dựng về câu trả lời Daniel Fischer, đây là một wrapper cho cabal rằng hủy bỏ cài đặt nếu nó sẽ cài đặt lại một gói:

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]" 
} 

YMMV; Tôi đã chỉ kiểm tra nhẹ điều này và nó gây ra một sự chậm trễ gây phiền nhiễu lúc khởi động vì tất cả các phụ thuộc phải được tính hai lần. Nhưng nó sẽ giảm bớt một số tedium nếu bạn muốn ở bên an toàn.

+0

+1 Tôi không biết về điều này, cảm ơn ... Tôi đoán đây sẽ là equiv Haskell của virtualenv của Python. –

+0

tuyệt vời, mặc dù cho zsh, xóa địa phương (và thêm một lời nhắc làm thế nào để cài đặt anyway - http://pastebin.com/PGYWqdKA). nó dường như làm việc cho ví dụ funsat (ngừng cài đặt), và cho phép cài đặt 'repa', không phá vỡ bất cứ thứ gì. vì vậy, cảm ơn !! – gatoatigrado

+0

cũng tuyệt vời để biết về 'lệnh', bây giờ tôi có thể kéo ra một vài hack của các chức năng vỏ khác. – gatoatigrado

5

Cách giải quyết: luôn kiểm tra với --dry-run trước tiên. Nếu cabal sẽ cài đặt lại bất kỳ gói, xem ra.

2

Đây là sự cố đã biết (xem this slide deck, bắt đầu bằng trang trình bày 22). Phiên bản Darcs của cabal-install (darcs get http://darcs.haskell.org/cabal) hiện hiển thị cảnh báo khi cài đặt gói sẽ phá vỡ hệ thống của bạn. Ví dụ:

$ 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.
Các vấn đề liên quan