Gỡ cài đặt / xóa gói Homebrew bao gồm tất cả các phụ thuộc của nó


338

Tôi có một công thức Homebrew mà tôi muốn gỡ cài đặt / xóa cùng với tất cả các phụ thuộc của nó, bỏ qua các gói mà các gói khác phụ thuộc vào (còn gọi là loại bỏ gói Cascading theo cách nói của trình quản lý gói).

ví dụ: Gỡ cài đặt gói aphụ thuộc vào gói b& c, nơi gói dcũng phụ thuộc vào gói c. Kết quả sẽ gỡ cài đặt cả a& b, bỏ qua c.

Làm thế nào tôi có thể làm điều đó?

Phải có một cách để gỡ cài đặt một gói mà không để lại rác không cần thiết phía sau.


3
Đây không phải là điều mà bất kỳ người quản lý gói nào, đáng để đặt tên này, nên làm hết khả năng?! LOL
mljrg

Câu trả lời:


406

BIÊN TẬP:

Có vẻ như vấn đề hiện đã được giải quyết bằng cách sử dụng một lệnh bên ngoài được gọi là brew rmdepshoặcbrew rmtree .

Để cài đặt và sử dụng, hãy ban hành các lệnh sau:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

Xem liên kết trên để biết thêm thông tin và thảo luận.


Câu trả lời gốc:

Dường như hiện tại, không có cách nào dễ dàng để thực hiện điều này.

Tuy nhiên, tôi đã gửi một vấn đề trên trang GitHub của Homebrew và ai đó đã đề xuất một giải pháp tạm thời cho đến khi họ thêm một lệnh độc quyền để giải quyết vấn đề này.

Có một lệnh bên ngoài được gọi là brew leavesin tất cả các gói không phụ thuộc vào các gói khác.

Nếu bạn làm một logic trên đầu ra của brew leavesbrew deps <package>, bạn có thể nhận được một danh sách các gói phụ thuộc mồ côi, mà bạn có thể gỡ cài đặt thủ công sau đó. Kết hợp điều này với xargsvà bạn sẽ có được những gì bạn cần, tôi đoán (chưa được kiểm tra, đừng tin vào điều này).


EDIT: Ai đó vừa đề xuất một giải pháp rất giống nhau, sử dụngjoin thay vì xargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

Xem bình luận về vấn đề được đề cập ở trên để biết thêm.


4
Dòng thứ hai báo lỗi : This command requires a keg argument.
Shmidt

7
brew rmtreeKịch bản của bên thứ ba hiện có sẵn trong một vòi:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Nick McCurdy

1
@NicolasMcCurdy Tôi đã thử và có thể xác nhận đây thực sự là cách thuận tiện nhất hiện nay.
Ban nhạc Ory

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))làm tốt công việc Bạn chỉ cần chạy đi chạy lại cho đến khi tất cả các phụ thuộc được loại bỏ. Nó không thể gỡ cài đặt mọi thứ cùng một lúc vì các phụ thuộc phụ thuộc lẫn nhau.
Greg Wang

1
Các && brew install brew-rmtreekhông còn cần thiết.
Boris

34

Mục tiêu ở đây là loại bỏ gói đã cho và các phụ thuộc của nó mà không phá vỡ các phụ thuộc của gói khác. Tôi sử dụng lệnh này:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

Lưu ý: Đã chỉnh sửa để phản ánh nhận xét hữu ích của @ alphadogg.


Phải thêm --ignore-dependenciesđể loại bỏ để cho phép điều này làm việc.
alphadogg

2
Điều này đã phá vỡ cấu hình brew của tôi, vì nó không cài đặt lại các dep được sử dụng trong các gói khác. KHÔNG SỬ DỤNG
Marco Pappalardo

25

brew rmtree hoàn toàn không hoạt động . Từ các liên kết về vấn đề đó, tôi thấy rmrec thực sự hoạt động. Chúa biết tại sao brewkhông có điều này như một mệnh lệnh bản địa.

brew tap ggpeti/rmrec
brew rmrec pkgname

Thực sự YÊU điều này, mặc dù nếu bạn đã bắt đầu con đường gỡ cài đặt cho mình và tiếp tục tìm thêm các gói bạn cần xóa, bạn vẫn cần biết các gói chạm rộng nhất là gì, hoặc bạn có thể chỉ cần cài đặt lại một cách nhanh chóng [FORMULA]và sau đó sử dụng rmrec để loại bỏ đệ quy tất cả các phụ thuộc của nó đúng cách.
dragon788

2
Hãy cẩn thận: Nó cũng xuất hiện rmreckhông xử lý các gói có tên rất tốt. Tôi đang sử dụng thứ gì đó kéo vào linuxbrew/xorg/xorgvà nó đã loại bỏ mọi thứ trừ gói đó và thậm chí đặt tên rõ ràng cho gói đó, nó không thể giải quyết nó và không làm gì cả.
dragon788

Khẳng định rằng khuyến nghị sử dụng rmreclà xấu. Nó không xử lý phụ thuộc cả.
omv

Ý bạn là rmtreesao? rmreckhông xử lý các phụ thuộc.
Timmmm

1
God knows why brew doesn't have this as a native command.=> Bởi vì các nhà phát triển bia có thái độ xấu. Họ thậm chí không cho phép mọi người mở bất kỳ vấn đề. Kiểm tra github.com/Homebrew/brew , hiện tại nó chỉ có ít hơn 20 vấn đề. Một con số nhỏ như vậy. Đó có phải là một điều tốt? Không, nó rất tệ.
sgon00

15

Dựa trên câu trả lời @jfmercer (chỉnh sửa cần nhiều hơn bình luận).

Xóa các phụ thuộc của gói (không xóa gói):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

Xóa gói:

brew remove [FORMULA]

Cài đặt lại các thư viện bị thiếu:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

Đã thử nghiệm gỡ cài đặt meldsau khi phát hiện ra các bản phát hành MeldMerge .


Tôi đã cài đặt ffmpeg với brew, điều này làm mọi thứ rối tung lên. Dọn dẹp ffmpeg, bao gồm danh sách phụ thuộc mở rộng của nó, với phương pháp được mô tả ở trên, làm việc cho tôi.
webtweaker

13

Sử dụng câu trả lời này yêu cầu bạn tạo và duy trì một tệp chứa tên gói bạn muốn cài đặt trên hệ thống của mình. Nếu bạn chưa có, hãy sử dụng lệnh sau và xóa tên gói mà bạn không muốn tiếp tục cài đặt.

brew leaves > brew_packages

Sau đó, bạn có thể xóa tất cả các gói đã cài đặt, nhưng các gói không mong muốn và mọi phụ thuộc không cần thiết bằng cách chạy lệnh sau

brew_clean brew_packages

brew_clean có sẵn ở đây: https://gist.github.com/cskeeter/10ff1295bca93808213d

Tập lệnh này nhận tất cả các gói bạn đã chỉ định trong brew_packages và tất cả các phụ thuộc của chúng và so sánh chúng với đầu ra của brew list và cuối cùng loại bỏ các gói không mong muốn sau khi xác minh danh sách này với người dùng.

Tại thời điểm này nếu bạn muốn xóa gói a, bạn chỉ cần xóa nó khỏi tệp brew_packages sau đó chạy lại brew_clean brew_packages. Nó sẽ loại bỏ b, nhưng không c.


Tôi nghĩ rằng brew cleaner đã được tích hợp sẵn, hãy thửbrew clean -s
Devin G Rhode

1
TRÊN COMMENT ĐƯỢC SAI, chỉnh sửa cắt sau 5 phút. thửbrew cleanup -s && brew cask cleanup
Devin G Rhode

5

Bạn chỉ có thể sử dụng một ống UNIX cho việc này

brew deps [FORMULA] | xargs brew rm

12
Đây không phải là một giải pháp tốt. Bạn có thể phá vỡ sự phụ thuộc của các gói khác theo cách này.
Ban nhạc Ory

12
Có một lệnh bạn có thể chạy sau đó để cho bạn biết nếu bạn đã gỡ bỏ bất kỳ sự phụ thuộc cần thiết nào khác brew missingsẽ cho bạn biết lệnh nào bạn cần chạy để lấy lại chúng
SeanJA

4

Lưu tập lệnh sau dưới dạng brew-purge

#!/bin/bash
#:Usage: brew purge formula
#: 
#:Removes the package and all dependancies.
#: 
#: 
PKG="$1"
if [ -z "$PKG" ];then
   brew purge --help
   exit 1
fi
brew rm $PKG
[ $? -ne 0 ] && exit 1
while brew rm $(join <(brew leaves) <(brew deps $PKG)) 2>/dev/null
  do :
done
echo Package $PKG and its dependancies have been removed.
exit 0

Bây giờ cài đặt nó với lệnh sau

sudo install brew-purge /usr/local/bin

Bây giờ chạy nó

brew purge package

Ví dụ sử dụng gpg

$ brew purge gpg
Uninstalling /usr/local/Cellar/gnupg/2.2.13... (134 files, 11.0MB)
Uninstalling /usr/local/Cellar/adns/1.5.1... (14 files, 597.5KB)
Uninstalling /usr/local/Cellar/gnutls/3.6.6... (1,200 files, 8.9MB)
Uninstalling /usr/local/Cellar/libgcrypt/1.8.4... (21 files, 2.6MB)
Uninstalling /usr/local/Cellar/libksba/1.3.5... (14 files, 344.2KB)
Uninstalling /usr/local/Cellar/libusb/1.0.22... (29 files, 508KB)
Uninstalling /usr/local/Cellar/npth/1.6... (11 files, 71.7KB)
Uninstalling /usr/local/Cellar/pinentry/1.1.0_1... (12 files, 263.9KB)
Uninstalling /usr/local/Cellar/libassuan/2.5.3... (16 files, 444.2KB)
Uninstalling /usr/local/Cellar/libtasn1/4.13... (59 files, 436KB)
Uninstalling /usr/local/Cellar/libunistring/0.9.10... (54 files, 4.4MB)
Uninstalling /usr/local/Cellar/nettle/3.4.1... (85 files, 2MB)
Uninstalling /usr/local/Cellar/p11-kit/0.23.15... (63 files, 2.9MB)
Uninstalling /usr/local/Cellar/gmp/6.1.2_2... (18 files, 3.1MB)
Uninstalling /usr/local/Cellar/libffi/3.2.1... (16 files, 296.8KB)
Uninstalling /usr/local/Cellar/libgpg-error/1.35... (27 files, 854.8KB)
Package gpg and its dependancies have been removed.
$ 

2

Các câu trả lời khác không phù hợp với tôi, nhưng điều này đã làm (bằng fishvỏ):

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

Bởi vì brew remove $pthất bại khi một số gói khác phụ thuộc vào p.


2

Một chức năng vỏ Bourne hoàn chỉnh hơn

Đã có một số câu trả lời hay, nhưng một số đã hết hạn và không có câu trả lời nào hoàn chỉnh. Cụ thể, hầu hết trong số họ sẽ loại bỏ các phụ thuộc nhưng vẫn tùy thuộc vào bạn để xóa công thức được nhắm mục tiêu ban đầu sau đó. Các lớp lót được đăng cũng có thể tẻ nhạt để làm việc nếu bạn muốn gỡ cài đặt nhiều hơn một công thức cùng một lúc.

Dưới đây là hàm shell tương thích Bourne (không có bất kỳ Bashism nào đã biết) lấy danh sách các công thức, loại bỏ các phụ thuộc của từng người, xóa tất cả các bản sao của công thức và sau đó cài đặt lại bất kỳ phụ thuộc bị thiếu nào.

unbrew () {
    local formula
    for formula in "$@"; do
        brew deps "$formula" |
        xargs brew uninstall --ignore-dependencies --force
        brew uninstall --force "$formula"
    done
    brew missing | cut -f2 -d: | sort -u | xargs brew install
}

Nó đã được thử nghiệm trên Homebrew 1.7.4.

Hãy cẩn thận

Điều này hoạt động trên tất cả các công thức tiêu chuẩn mà tôi đã thử nghiệm. Hiện tại nó không xử lý các thùng, nhưng nó cũng sẽ không phàn nàn lớn nếu bạn cố gắng mở một thùng có cùng tên với một công thức tiêu chuẩn (ví dụ MacVim).


1

Câu trả lời của @jfmercer phải được sửa đổi một chút để hoạt động với brew hiện tại, vì đầu ra của brew missingđã thay đổi:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.