Удалить / удалить пакет Homebrew, включая все его зависимости


339

У меня есть формула Homebrew, которую я хочу удалить / удалить вместе со всеми ее зависимостями, пропуская пакеты, от которых зависят другие пакеты (иначе говоря, Каскадное удаление пакетов на языке диспетчера пакетов).

Например, удалить пакет, aкоторый зависит от пакетов b& c, где пакет dтакже зависит от пакета c. Результат должен удалить оба a& b, пропуская c.

Как я могу это сделать?

Должен быть способ удалить пакет, не оставляя ненужного мусора .


3
Разве это не то, что любой менеджер пакетов, достойный этого имени, должен делать из коробки ?! LOL
mljrg

Ответы:


407

РЕДАКТИРОВАТЬ:

Похоже, что теперь проблема решена с помощью внешней команды, называемой brew rmdepsилиbrew rmtree .

Для установки и использования выполните следующие команды:

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

Смотрите ссылку выше для получения дополнительной информации и обсуждения.


Оригинальный ответ:

Похоже, что в настоящее время нет простого способа сделать это.

Тем не менее, я подал проблему на странице GitHub Homebrew , и кто-то предложил временное решение, пока они не добавят эксклюзивную команду для решения этой проблемы.

Там есть внешняя команда называется , brew leavesкоторая печатает все пакеты, которые не являются зависимостями других пакетов.

Если вы выполняете логическое и на выходе brew leavesи brew deps <package>, вы можете просто получить список потерянных пакетов зависимостей, которые впоследствии можно удалить вручную. Объедините это с, xargsи вы получите то, что вам нужно, я думаю (не проверено, не рассчитывайте на это).


РЕДАКТИРОВАТЬ: Кто-то просто предложил очень похожее решение, используя joinвместо xargs:

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

См. Комментарий к проблеме, упомянутой выше, для получения дополнительной информации.


4
Вторая строка выдает ошибку: This command requires a keg argument.
Шмидт

7
Сторонний brew rmtreeсценарий теперь доступен в кране:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
Ник МакКарди

1
@NicolasMcCurdy Я пытался и могу подтвердить, что это действительно самый удобный способ в настоящее время.
Ory Band

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))делает работу хорошо. Вам просто нужно запускать его снова и снова, пока все зависимости не будут удалены. Он не может удалить все сразу, потому что зависимости взаимозависимы друг с другом.
Грег Ван

1
Это && brew install brew-rmtreeбольше не нужно.
Борис

34

Цель здесь - удалить данный пакет и его зависимости, не нарушая зависимости другого пакета. Я использую эту команду:

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

Примечание: отредактировано, чтобы отразить полезный комментарий @ alphadogg.


Пришлось добавить --ignore-dependenciesудалить, чтобы это работало.
alphadogg

2
Это нарушило мою конфигурацию brew, так как не переустанавливало deps, используемые в других пакетах. НЕ ИСПОЛЬЗУЙТЕ
Марко Паппалардо

26

brew rmtree не работает вообще . Из ссылок по этому вопросу я нашел rmrec, который действительно работает. Бог знает, почему brewне имеет этого как родную команду.

brew tap ggpeti/rmrec
brew rmrec pkgname

Действительно ЛЮБИТЕ это, хотя, если вы уже пошли по пути удаления себя и продолжаете находить больше пакетов, которые нужно удалить, вам все равно нужно знать, какие пакеты являются наиболее распространенными, или вы можете просто ненадолго переустановить [FORMULA]и затем использовать rmrec. правильно рекурсивно удалить все его зависимости.
dragon788

2
Предостережение: Похоже, rmrecчто в настоящее время не очень хорошо обрабатывает пакеты с именами. Я использовал что-то, что вытянуло, linuxbrew/xorg/xorgи он удалил все, кроме этого пакета, и даже явно назвал этот пакет, он не смог разрешить его и ничего не сделал.
dragon788

Подтвердил, что рекомендация использовать rmrecэто плохо. Он вообще не обрабатывает зависимости.
OMDV

Вы имеете в виду rmtree? rmrecдействительно обрабатывает зависимости.
Тимммм

1
God knows why brew doesn't have this as a native command.=> Потому что разработчики варки имеют плохие отношения. Они даже не позволяют людям открывать какие-либо проблемы. Проверьте github.com/Homebrew/brew , он имеет только менее чем 20 вопросов , в настоящее время. Такое небольшое количество. Это хорошая вещь? Нет, это очень плохо.
sgon00

15

Основано на ответе @jfmercer (для исправления нужно больше, чем комментарий).

Удалить зависимости пакета (не удаляет пакет):

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

Удалить пакет:

brew remove [FORMULA]

Переустановите отсутствующие библиотеки:

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

Проверено удаление meldпосле обнаружения выпусков MeldMerge .


Я установил ffmpeg с brew, что сильно испортило ситуацию. Очистка ffmpeg, включая расширенный список зависимостей, с помощью описанного выше метода работала для меня.
webtweakers

13

Использование этого ответа требует, чтобы вы создали и поддерживали файл, содержащий имена пакетов, которые вы хотите установить в своей системе. Если у вас его еще нет, используйте следующую команду и удалите имена пакетов, которые вы не хотите оставлять установленными.

brew leaves > brew_packages

Затем вы можете удалить все установленные, но нежелательные пакеты и все ненужные зависимости, выполнив следующую команду

brew_clean brew_packages

brew_cleanдоступно здесь: https://gist.github.com/cskeeters/10ff1295bca93808213d

Этот скрипт получает все пакеты, которые вы указали в brew_packages, и все их зависимости, сравнивает их с выводом brew listи, наконец, удаляет нежелательные пакеты после проверки этого списка с пользователем.

На этом этапе, если вы хотите удалить пакет a, вы просто удалите его из файла brew_packages, а затем снова запустите brew_clean brew_packages. Это удалит b, но нет c.


Я думаю, что варка теперь встроена, попробуйтеbrew clean -s
Девин Г Род

1
ВЫШЕ КОММЕНТАРИЙ НЕПРАВИЛЬНО, редактирование обрывается через 5 минут. попробуйтеbrew cleanup -s && brew cask cleanup
Девин Г. Род

5

Вы можете просто использовать канал UNIX для этого

brew deps [FORMULA] | xargs brew rm

12
Это не хорошее решение. Таким способом вы можете нарушить зависимости других пакетов.
Ory Band

12
Есть команда, которую вы можете запустить позже, чтобы сообщить вам, если вы уничтожили любые другие необходимые зависимости, brew missingкоторая скажет вам, какую команду вам нужно запустить, чтобы получить их обратно
SeanJA

4

Сохраните следующий скрипт как 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

Теперь установите его с помощью следующей команды

sudo install brew-purge /usr/local/bin

Теперь запустите

brew purge package

Пример использования 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

Другие ответы не сработали для меня, но это сработало (в fishоболочке):

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

Потому что brew remove $pне удается, когда какой-то другой пакет зависит от p.


2

Более полная функция оболочки Борна

Уже есть много хороших ответов, но некоторые устарели, и ни один из них не является полностью полным. В частности, большинство из них удалит зависимости, но все же предоставит вам возможность удалить первоначально намеченную формулу впоследствии. Размещенные однострочники также могут быть утомительными, если вы хотите удалить более одной формулы за раз.

Вот Bourne-совместимая функция оболочки (без каких-либо известных Bashisms), которая берет список формул, удаляет зависимости каждой из них, удаляет все копии самой формулы, а затем переустанавливает все отсутствующие зависимости.

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
}

Было протестировано на Homebrew 1.7.4.

Предостережения

Это работает на всех стандартных формулах, которые я тестировал. В настоящее время он не работает с бочками, но также не будет громко жаловаться, если вы попытаетесь отвинтить бочку с тем же именем, что и у стандартной формулы (например, MacVim).


1

Ответ @jfmercer должен быть немного изменен, чтобы работать с текущим пивоварением, потому что выходные данные brew missingизменились:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.