Каждый, кто пересаживался на Mac OS был приятно удивлён, что во многих случаях установка программ на этой операционке сводится к простому «Перетащить программу в папку “Программы“» и всё. Дальше просто кликаешь по ней и она запускается. Я получал массу удовольствия от такого простого, дружелюбного и понятного подхода. Я чётко понимал: где я положил программу, там я её удалю и она попросту исчезнет. Лепота, да и только. Наверно многие были наслышаны о таком славном подходе в макоси. Но увы (или к счастью) нет ничего идеального и программы бывает нужно устанавливать и на маке, в полном смысле этого слова.
Меня это немного разочаровало в своё время, но до недавних пор это как-то не вызывало особых проблем, т.к. я пользовался нормальным софтом, который обычно поставлял с собой скрипты-деинсталляторы для .pkg пакетов. Но вот я решил установить программу FontForge для редактирования шрифтов, которая изначально разрабатывалась под идеологию linux и это моментально принесло с собой неразберху — FontForge.pkg начал методично размазывать себя по всевозможным папкам вместо того, чтобы попросту расположиться в “/Applications/FontForge.app”. Что ещё более усложнило ситуацию — у FontForge отсутствовал какой-либо деинсталлятор. Когда пришло время удалить FontForge я задался вполне резонным вопросом: как же всё же по-человечески удалить программу установленную из .pkg, которая не предлагает полноценного деинсталлятора? Я бы и руками был согласен всё почистить, но я попросту не знал куда pkg раскидал файлы по диску.
Теория
Поискав по мануалам я нашёл более-менее порядочный способ. Для этого приходится перейти на уровень консоли чтобы выполнить удаление этой и подобно установленных программ. Делется это при помощи консольной утилиты lsbom.
Так повелось, что основная часть данных об уже установленных пакетах, начиная с Mac OS 10.6, лежат в папке “/var/db/receipts/” в виде .bom (bill of materials) файлов. Часть же пакетов (с bom файлами внутри) лежат в старом месте “/Library/Receipts/” — это основное место для предыдущих версий mac os. Поскольку в версиях mac os до 10.6 файлы bom могли лежать в пакетах, то выглядело (и выглядит) это примерно так:
1 |
/Library/Receipts/some_app.pkg/Contents/Archive.bom |
Начиная с 10.6, bom фалы в основном можно найти так:
1 |
/var/db/receipts/AppName.bom |
Как уже наверно можно было догадаться, bom файл содержит данные о том, что было записано в файловую систему при инсталляции определённого пакета.
Практика
Наконец сами команды удаления установленного пакета с комментариями:
1 2 3 4 5 6 7 8 9 |
# Удаляем все файлы пакета: # lsbom -fls выводит список файлов и символических ссылок созданных пакетом # cd / - переходит в корень, т.к. все файлы в списке начинаются с "." # затем список файлов через xargs передаётся в rm, который запускается от имени root lsbom -fls /var/db/receipts/AppName.bom | (cd /; sudo xargs rm) # Удаляем все пустые папки аналогичным подходом. lsbom -dls /var/db/receipts/AppName.bom | (cd /; sudo xargs rmdir -p) # Удаляем файлы оставшиеся от установщика sudo rm AppName.bom AppName.plist |
Возможные проблемы
Надо быть очень осторожным с этими командами т.к. они во-первых выполняются от имени root, а во-вторых в корне файловой системы. Перед подобным удалением установленного пакета лучше убедитесь, что lsbom в списке файлов случайно не укажет какой-нибудь путь, который будучи удалённым из корня приведёт к удалению системных файлов. Так же не пробуйте удалять системные пакеты от Apple — у вас начнутся проблемы с обновлением и ещё бог весть с чем.
Я конечно же знаю про стороннюю утилиту PackageAssistant, которая позволяет управлять пакетами в системе, но последнее обновление у неё датируется 2008 годом. Анализ её исходников мною только подтверждает, что она не подходит для Mac OS 10.6, поскольку ею обрабатываются bom файлы только пакетов лежащих в “/Library/Receipts”, а это, как я уже говорил, применимо только до 10.6.
P.S.: Вообще всё это вопрос добросовестности программистов на чьей ответственности лежит разработка инсталлятора (особенно учитывая факт, что Apple не предоставляет штатных gui средств для работы с установленными пакетами). Под остальными системами так же хватает безответственных программ, после которых систему можно сутками вычищать от хлама. От этого ни одна система не застрахована.
UPD: Как мне подсказали в каментах, можно так же воспользоваться другой консольный утилитой (она тоже не 100% панацея, но можно оба способа пробовать):
1 |
pkgutil --unlink PkgName |
Народ подсказывает:
pkgutil –remove pkgName спасет отца русской демократии(правда, не всегда)