pactree — утилита из пакета pacman-contrib, которая строит дерево зависимостей любого пакета в Arch Linux. Запусти pactree firefox — и увидишь весь список пакетов, которые тянет за собой Firefox, а pactree -r firefox покажет обратное дерево: кто зависит от Firefox. Это главный инструмент, когда нужно понять, почему в системе появился тот или иной пакет.
pactree входит в состав pacman-contrib — набора вспомогательных утилит для pacman. Проверь, установлен ли он:
pacman -Q pacman-contrib
Если пакета нет — поставь его:
sudo pacman -S pacman-contrib
pactree читает базу данных pacman и выводит зависимости пакета в виде дерева. Каждая строка — один пакет, а отступы показывают уровень вложенности. В отличие от pacman -Qi, который показывает только прямые зависимости, pactree раскрывает всю цепочку: зависимости зависимостей и так до самого низа.
Важная деталь: pactree работает не только с установленными пакетами. Он умеет читать базу репозиториев, поэтому может показать дерево зависимостей пакета, который ты ещё не ставил. Это удобно перед установкой: сразу видно, что потянется в систему.
Утилита пригодится в трёх случаях. Первый — отладка установки: что-то не работает, и нужно понять, какие библиотеки тянет пакет. Второй — выяснение происхождения пакета: откуда в системе взялся libfoo, который ты не ставил. Третий — планирование: перед установкой программы полезно посмотреть, сколько зависимостей она притащит и не раздует ли систему.
Базовый запуск выглядит так:
pactree firefox
Вывод начинается с самого пакета, а ниже идут его зависимости. Первая строка — firefox, дальше gtk4, libx11, nss и так далее. Отступы показывают, какой пакет от какого зависит. Чем глубже уровень, тем дальше пакет от корня дерева.
Примерно так выглядит фрагмент вывода:
firefox
├─gtk4
│ ├─cairo
│ ├─gdk-pixbuf2
│ └─pango
├─libx11
└─nss
Символы ├─ и └─ — это ветки дерева. Пакеты под gtk4 нужны самому gtk4, а не Firefox напрямую. Если убрать gtk4, Firefox не запустится, потому что без него не соберётся вся ветка ниже.
Полезный флаг -s — выводит размер каждого пакета:
pactree -s firefox
Так сразу видно, какие зависимости занимают больше всего места. Флаг -c включает цвета, чтобы дерево читалось легче:
pactree -c firefox
Цвета особенно помогают в длинном выводе: глаза цепляются за уровни вложенности быстрее, чем за отступы.
Полное дерево Firefox — это сотни строк. Если нужны только прямые зависимости, ограничь глубину:
pactree -d 1 firefox
-d 1 показывает только то, что тянет сам Firefox, без зависимостей зависимостей. -d 2 добавляет один уровень вложенности:
pactree -d 2 firefox
Глубина 1 — самый частый сценарий: так удобно смотреть, что именно тянет пакет напрямую, и искать лишнее. Глубина 2 нужна, когда прямые зависимости не объясняют картину и хочется заглянуть на уровень ниже.
Флаг -d работает и с обратным деревом, и с другими флагами. Например, pactree -d 1 -s firefox покажет прямые зависимости с размерами, а pactree -r -d 1 firefox — только тех, кто зависит от Firefox напрямую. Флаги свободно комбинируются, так что под любую задачу собирается своя команда.
Обратное дерево показывает, какие пакеты зависят от выбранного. Это нужно, когда собираешься удалить пакет и хочешь понять, что сломается:
pactree -r firefox
Вывод покажет Firefox и всё, что от него зависит: например, firefox-i18n-ru, если ты ставил языковой пакет. Чем выше пакет в дереве, тем дальше он от корня. Флаг -r работает вместе с -d:
pactree -r -d 1 firefox
Так ты увидишь только тех, кто зависит от Firefox напрямую. Комбинация -r -d 1 — стандартный способ проверить, можно ли безопасно удалить пакет.
Цикл — ситуация, когда пакет A зависит от B, B от C, а C снова от A. В нормальной системе циклы встречаются редко, но бывают, особенно после ручных правок или при сборке своих пакетов. Цикл мешает pacman корректно вычислить порядок установки и удаления.
Искать циклы удобно обратным деревом:
pactree -r -d 2 python
Если в выводе пакет повторяется на разных уровнях — перед тобой цикл. Например, python тянет python-setuptools, а тот в свою очередь зависит от python. Это нормальный цикл, pacman с ним справляется, но знать о нём полезно. При сборке своих пакетов циклы чаще становятся проблемой: makepkg может не собрать пакет, пока не разрешишь зависимость.
Флаг -u показывает только те зависимости, которых нет в системе. Обычно вывод пустой: pacman не даёт установить пакет без зависимостей. Но после частичного обновления или ручного удаления пакета в базе появляются дыры.
pactree -u firefox
Если команда что-то вывела — в системе не хватает пакетов, которые нужны Firefox. Чаще всего это следствие частичного обновления, когда часть пакетов обновилась, а часть осталась старой. Про то, почему так делать не стоит, — в статье «Частичное обновление: ignorepkg».
Неудовлетворённые зависимости появляются и после ручного удаления пакета через pacman -Rdd, когда ты обходишь проверку зависимостей. В такой ситуации pactree -u покажет, что именно сломалось, и ты сможешь вернуть недостающий пакет обратно.
pactree помогает выяснить, почему в системе оказался пакет, который ты не ставил. Возьми подозрительный пакет и посмотри обратное дерево:
pactree -r <пакет>
Цепочка покажет, какая программа тянет его за собой. Если пакет больше не нужен никому, его можно удалить как сироту:
pacman -Qdt
Список пакетов, которые не нужны ни одному установленному пакету, — кандидаты на удаление. Подробнее про опциональные и лишние зависимости — в статье «Зависимости: опциональные и лишние».
Ещё один приём — сравнить дерево до и после установки. Запиши pactree -d 1 <пакет> до установки, потом после, и посмотри, что добавилось. Так легко заметить, что программа притащила лишнее, и решить, стоит ли она того.
Дубли в дереве — это не ошибка. Один и тот же пакет может встречаться в разных ветках: например, glib2 нужен и gtk4, и pulseaudio. pactree показывает его в каждой ветке, потому что так устроено дерево. Это нормально, и удалять пакет из-за дубля не нужно. Вопрос только в том, нужен ли сам пакет, который тянет всю ветку.
pacman -Qi <пакет> показывает прямые зависимости в поле Depends On и тех, кто зависит от пакета, в поле Required By. Но это плоский список без уровней вложенности. pactree раскрывает дерево целиком.
pacman -Qdt — это фильтр сирот: пакеты, которые не нужны ни одному установленному пакету. pactree же показывает, почему пакет вообще попал в систему. Эти инструменты дополняют друг друга: pacman -Qdt находит кандидатов на удаление, а pactree -r объясняет, откуда взялся конкретный пакет.
Разница видна на примере. pacman -Qi firefox покажет в Depends On десяток прямых зависимостей. pactree firefox покажет те же пакеты плюс всё, что они тянут за собой, — сотни строк. Для быстрой проверки хватает pacman -Qi, для полной картины нужен pactree.
Поставь pacman-contrib:
sudo pacman -S pacman-contrib
Вместе с pactree придут checkupdates, rankmirrors и другие утилиты из набора. Проверить установку можно командой pacman -Q pacman-contrib.
pactree работает с базой данных pacman и показывает зависимости, даже если пакет не установлен. Флаг -u оставляет только неудовлетворённые зависимости — те, которых не хватает:
pactree -u <пакет>
Это удобно при отладке сборки или переноса системы. Пустой вывод означает, что все зависимости на месте.
pactree умеет работать с пакетами из репозиториев, даже если они не установлены. Просто передай имя пакета — pactree найдёт его в базе. Для пакетов из AUR это не сработает: их нет в базе pacman. В этом случае сначала собери и установи пакет, а потом смотри его дерево.
Если pacman застревает на вычислении зависимостей, проверь, какие пакеты образуют цикл, через pactree -r. Обычно помогает пересборка одного из пакетов цикла или временное удаление лишнего. Про зависшие обновления и способы их прервать — в статье «pacman -Syu завис: как прервать». Если после прерывания обновления база осталась в странном состоянии, проверь целостность пакетов командой pacman -Qkk — подробности в разделе «Полезные ресурсы».
pactree — маленькая утилита, которая отвечает на большой вопрос: откуда взялся пакет и что он тянет за собой. pactree <пакет> показывает дерево зависимостей, pactree -r <пакет> — обратное дерево, а флаги -d, -s, -u и -c делают вывод удобным под конкретную задачу. Держи её в голове, когда pacman приносит что-то неожиданное, — и система перестанет быть чёрным ящиком.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии