Видаліть / видаліть пакет 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і ви отримаєте те, що вам потрібно, я думаю (неперевірено, на це не розраховуйте).


EDIT: Хтось просто запропонував дуже схоже рішення, використовуючи 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для видалення, щоб дозволити цьому працювати.
альфадог

2
Це порушило мою варивочную конфігурацію, оскільки не перевстановило деп, які використовуються в інших пакетах. ВИКОРИСТАННЯ
Марко Паппалардо

25

brew rmtree зовсім не працює . З посилань на це питання я знайшов rmrec, який насправді працює. Бог знає, чому brewцього немає як рідна команда.

brew tap ggpeti/rmrec
brew rmrec pkgname

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

2
Caveat: Також, схоже rmrec, в даний час не дуже добре обробляються пакети з іменами. Я використовував щось, що втягнулося, linuxbrew/xorg/xorgі він видалив усе, крім цього пакету, і навіть явно назвав цей пакет, він не міг його вирішити і нічого не робив.
dragon788

Підтвердив, що рекомендація щодо використання rmrecпогана. Він взагалі не справляється із залежностями.
omdv

Ви маєте на увазі rmtree? rmrecсправляється із залежностями.
Timmmm

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 з варінням, який сильно псував речі. Прибирання 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 є вбудованим зараз, спробуйтеbrew clean -s
Devin G Rhode

1
ВІД КОМЕНТАРУ БУЛИ НЕГОЛОМНИЙ, редагування відключається за 5 хвилин. спробуйтеbrew cleanup -s && brew cask cleanup
Devin G Rhode

5

Ви можете просто використовувати для цього UNIX трубу

brew deps [FORMULA] | xargs brew rm

12
Це не гарне рішення. Таким чином можна розбити залежність інших пакетів.
Ory Band

12
Існує команда, яку ви можете запустити після цього, щоб сказати вам, чи ви запустили будь-які інші необхідні залежності, brew missingякі підкажуть, яку команду потрібно виконати, щоб повернути їх
SeanJA

4

Збережіть такий сценарій як заварку

#!/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

Більш повна функція оболонки Борна

Уже є низка хороших відповідей, але деякі застаріли, і жодна з них не є повністю повною. Зокрема, більшість із них видалить залежності, але все-таки залишатиметься за вами, щоб потім видалити первинно націлену формулу. Опубліковані однолінійки також можуть бути важкими для роботи, якщо ви хочете видалити більше однієї формули за один раз.

Ось функція оболонки, сумісна з Борном (без відомих башизмів), яка бере список формул, видаляє залежність кожної, видаляє всі копії формули самої, а потім знову встановлює будь-які відсутні залежності.

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.