Удаление программ в 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
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 29
    • +1
      >Вообще всё это вопрос добросовестности программистов на чьей ответственности лежит разработка инсталлятора

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

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

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

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

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

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