14 апреля 2010 в 17:13

Удаление программ в Mac OS установленных из пакетов .pkg

Мак ОС и установщики


Каждый, кто пересаживался на 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 могли лежать в пакетах, то выглядело (и выглядит) это примерно так:

/Library/Receipts/some_app.pkg/Contents/Archive.bom

Начиная с 10.6, bom фалы в основном можно найти так:

/var/db/receipts/AppName.bom

Как уже наверно можно было догадаться, bom файл содержит данные о том, что было записано в файловую систему при инсталляции определённого пакета.

Практика


Наконец сами команды удаления установленного пакета с комментариями:
# Удаляем все файлы пакета:
# 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% панацея, но можно оба способа пробовать):

pkgutil --unlink PkgName

UPD2: Перенесено в Mac OS X
+38
12354
80
sashkin 3,1

Комментарии (29)

+1
Gorthauer87, #
>Вообще всё это вопрос добросовестности программистов на чьей ответственности лежит разработка инсталлятора

А в чем проблема то не понимаю? Если что-то в системе ставится через pkg, то я так понимаю в базу данных список файлов таки попадает.
Просто в Линуксе то при установке любого пакета в бд пишется список его файлов, а перед установкой проверяется, не возникнут ли в процессе установки конфликты.
Короче имхо достаточно просто какой-нибудь вменяемой морды для работы с pkg, меня вообще удивляет, что она отсутствует.
Имхо разработчики софта вообще не должны особо заботится о его распространении, это работа мейнтейнеров
+3
sashkin, #
У эппл нет такой стандартной утилиты по удалению pkg, а вот сторонние разработчики постарались и написали PackageAssistant (который благополучно устарел). Идеология, как я понимаю, у эппл простая — в pkg должно поставляться ПО, которое вносит изменения в ОС, библиотеки и прочее. Обычные программы не требующие расширения системы в любом виде, должны запускаться просто с того места где они есть. FontForge обычный редактор шрифтов, которому что-то добавлять в папки макоси вобщем-то нечего. Однако из-за того что это изначально Linux тулза (с соответствующей файловой идеологией и иерархией), то чтобы облегчить портирование под макось они не меняя структуры каталогов попросту всё собрали в пакет, который благополучно пишет что-то в /usr/local и не только.

А вот разработчики FontForge зная, что эппл не даёт пользователю встроенных gui средств для удаления пакетов, могли бы потратить пол часика и сделать скрипт для пользователя… :) Я об этом.
+1
Gorthauer87, #
>А вот разработчики FontForge зная, что эппл не даёт пользователю встроенных gui средств для удаления пакетов, могли бы потратить пол часика и сделать скрипт для пользователя… :) Я об этом.

Осмелюсь предположить, что разработчики FontForge вообще не причастны к этому билду :) И для подобного софта есть вполне централизованный macports
+2
sashkin, #
Установщик приложения для мака был взят с официального сайта проекта на sourceforge. Думаю такой пакет можно с какой-то степенью считать официальным. :)
+1
XuMiX, #
pkgutil --remove pkgName спасет отца русской демократии(правда, не всегда)
+1
sashkin, #
Щас под рукой нет мака чтоб проверить, но мануалы говорят о том, что нет там такого ключа. И в добавок скромно заявляют:

Package dependency analysis and reference counting are not yet available, hence there is no --uninstall command yet.
+1
sashkin, #
наверно имелось ввиду --unlink? это похоже и выполняет удаление пакета без учёта каких-либо зависимостей…
0
XuMiX, #
да, писал по памяти
+2
DrAiv, #
Возможно я чего-то недопонял, но разве AppZapper и иже с ними не позволяют удалить любую программу со всеми зависимыми файлами легко и непринужденно?
+2
sashkin, #
На сколько я понял AppZapper ничего общего не имеет с установкой/деинсталляцией пакетов pkg. Он удаляет обычные приложения, удаляя не только приложение, но и все файлы созданные в процессе его работы. Это AppCleaner только за деньги. Да?
+2
dchertousov, #
Ухты, спасибо! AppZapper только что был удален с помощью AppCleaner :)
0
nikolay, #
AppZapper удаляет программы, виджеты, элементы из System Preferences (тот же Growl может снести), плагины… Я им пользовался для того чтобы удалять pkg-программы без анинсталлеров.
0
sashkin, #
Долго искал как там можно удалить pkg так и не нашёл. Либо вы перепутали, либо я не увидел.
0
nikolay, #
Зависит от конкретной программы. Ну вот, например, Adobe Reader из pkg устанавливался — я его могу выбрать и удалить. Специального места, где перечислены все pkg-программы там нету.
+1
Gorthauer87, #
> Это AppCleaner только за деньги. Да?

Вот удивляюсь я людям. Видимо намерено не предоставили средств для работы с pkg, а теперь другие хорошие люди исправляют это за деньги… Клево же! Хотя программисты Apple могли бы написать нужную функциональность за пару вечеров.
0
sashkin, #
В каждой OC чего-то не хватает по идеологическим соображениям. :) Каждую ОС мы потом ручками доводим до ума. Так или иначе. Можно долго думать и спорить, что должно быть в дефолтной поставке ОС, а что нет. Это тропа тёмной стороны Силы.
+1
uvarov, #
AppCleaner вам поможет. Пользуюсь с самого первого мака.
+3
sashkin, #
У AppCleaner другая задача. У меня она стоит, но ничего общего она с установкой/удалением pkg не имеет. Попробуйте удалить к примеру Growl или MacFuse с помощью AppCleaner и вы поймёте о чём я.
+5
crazyASD, #
Спасибо! Как макдрочер макюзер плюсанул.
+1
m0r0, #
Чтобы увидеть что внутри .pkg можно использовать Pacifist.
0
crazyASD, #
Ваистену.
0
sashkin, #
Ну посмотреть-то ладно, это полезно и нужно бывает. А потом ручками удалять уже установленные пакеты? И кстати Пацифист денег стоит. Это не минус, но тоже учитывать надо :)
0
sashkin, #
В смысле не установленные пакеты, а установленные файлы…
0
Morphling, #
Apptrap есть же. Как раз для таких случаев. Отслеживает всё, что притащила с собой программа, потом при удалении последней из applications спрашивает, дескать, удалить всё что пришло вместе с ней? Единственная проблема — ставить её нужно ДО установки программы, а не после. Интуитивно и бесплатно, рекомендую =)
0
sashkin, #
Постепенно набирается набор утилит для зачистки макоси. :) Сенк за наводку.
[imho] Я как-то побаиваюсь подобных автоматических следящих утилит. Всегда есть вероятность, что не то отследит и потом прибёт :) [/imho]
+2
hmage, #
Постепенно появляются чистилки реестра под макось.
0
malaka, #
DesInstaller вам в помощь
0
sashkin, #
Программка 2006 года и для PowerPC. На моём маке требует Rosetta :) Так и не установил :)
0
malaka, #
у меня на интеле (macbook pro) работает.

Только зарегистрированные пользователи могут оставлять комментарии.
Войдите, пожалуйста.