Homebrew не может удалить OpenVPN Connect: какой путь подходит?
Неудачное удаление cask — одна из трёх неисправностей. Прочитайте артефакты cask, сравните версии, затем выберите между повтором, обновлением или zap.
Три разные неисправности несут одно и то же сообщение об ошибке cask, и у каждой свой путь восстановления. Деинсталлятор поставщика может отсутствовать в установленной версии, вспомогательный процесс может всё ещё работать и удерживать свои файлы, или квитанция пакета может не совпадать с тем, что лежит на диске. Старый форумный обход, который спас один из этих случаев, ничего не говорит о том, какой из них у вас. Чтение собственной записи cask — это способ это выяснить.
Три неисправности, которые выглядят одинаково
Отсутствующий деинсталлятор выглядит как путь, которого нет, когда cask пытается его запустить. Живой вспомогательный процесс выглядит как удаление, которое начинается и затем застревает, или как приложение, которое снова появляется после выхода из него. Устаревшая квитанция выглядит так, когда собственная запись cask и база данных установщика расходятся в том, установлен ли продукт вообще.
Сохраните первый текст ошибки, прежде чем что-либо повторять. Вторая попытка перезаписывает состояние, которое создало сообщение, и именно исходная строка нужна сопровождающему или поставщику, чтобы различить эти случаи. Скопируйте её туда, где она переживёт повтор.
Если этот VPN несёт соединение, которое вы используете для работы, сначала подготовьте другой путь администрирования. Удаление клиента, который даёт вам доступ, — это решение об окне обслуживания, а не о Homebrew. Именно такой порядок делает неудачное удаление восстановимым, а не окончательным.
Прочитайте, что cask на самом деле установил
Собственный взгляд Homebrew — самое дешёвое доступное доказательство, и он ничего не меняет:
brew info --cask openvpn-connect
brew list --cask openvpn-connectПервая команда печатает метаданные cask и артефакты, которыми он управляет; вторая перечисляет то, что записано как установленное. Ни одна не доказывает, что каждый вспомогательный процесс на машине соответствует текущему рецепту, и именно поэтому более старая установка может отказать так, как текущий источник cask не описывает. Относитесь к двум выводам как к утверждению, которое нужно проверить, а не как к последнему слову о том, что существует.
Сравните записанную версию с собственной версией приложения, прежде чем выбирать путь. Расхождение объясняет отсутствующий деинсталлятор без более глубокой неисправности, и ответ — обновление до версии, которую ожидает cask, а не ручная чистка.
Что добавляет zap и сколько это стоит
Блок удаления в cask обрабатывает артефакты, которые объявляет рецепт: закрытие приложения, выгрузку задач запуска, удаление элемента входа, забывание квитанций пакета и удаление пакета приложения. Это обычный путь, и именно он должен работать.
--zap — это другой запрос. Он просит Homebrew удалить также пользовательские настройки и общие ресурсы, и документация предупреждает, что это может повлиять на другое программное обеспечение. В cask OpenVPN Connect блок zap удаляет openvpn.keychain-db и очищает данные поддержки приложений пользователя, а значит, сохранённые учётные данные и профили подключения уходят вместе с ним. Если профиль получен от организации, убедитесь, что можете зарегистрироваться заново, прежде чем выбирать этот путь.
| Condition | Path that fits | Path to avoid |
|---|---|---|
| Uninstaller path missing after an OS upgrade | Upgrade the cask to the version matching the app | Hand-writing a replacement script |
| Helper still running during removal | Quit the app and its menu agent, then retry | Deleting the bundle while the helper runs |
| Receipt exists but files are gone | Forget the receipt with the cask's own tooling | Recursive deletion of the Caskroom entry |
| You need the machine clean and can re-enroll | Zap, after reading the stanza | Zap on a machine whose profiles you cannot rebuild |
Пути, которые выглядят решительно и таковыми не являются
Написать поддельный remove.sh, который завершается с нулевым кодом выхода, — худший вариант в списке. Он заставляет удаление сообщить об успехе, тогда как задачи запуска, квитанции и данные приложений остаются на месте, поэтому следующая установка наследует наполовину удалённый продукт и запись, утверждающую обратное.
Ручное удаление каталога Caskroom или пакета приложения создаёт похожее состояние с другой стороны. Файлы исчезают, а квитанция остаётся. Тогда каждую следующую команду приходится обдумывать относительно машины, которая больше не соответствует собственной базе.
brew update-reset для всего репозитория — это большее вмешательство, чем оправдывает один неудачный cask. Он меняет состояние ваших tap, чтобы исправить проблему, которая никогда не касалась состояния tap, и может оставить вас отлаживать другой Homebrew, не тот, с которого вы начали.
Решение по порядку
Идите по порядку: прочитайте записанные артефакты cask, сравните версии, закройте каждый работающий компонент, повторите обычное удаление и только затем рассмотрите zap. Если обычный путь всё ещё не работает, сохраните ошибку и отнесите её сопровождающим cask или поставщику вместе с номерами версий.
Cask Cookbook прямо говорит, что установщикам пакетов нужны специфичные для продукта приёмы удаления и что zap необязателен и может удалять общие ресурсы. Эта рамка и есть правило решения: сначала обычное удаление, zap — когда вы принимаете цену учётных данных, ручное удаление — никогда.