Циклические зависимости пакетов (pacman, pactree)

Собственно не проблема, просто вопрос для повышения грамотности.
Заметил кольцевую ссылку в дереве пакетов, т.е пакет через цепочку других пакетов замыкается сам на себя.
$ pactree -r phonon-qt5-vlc
phonon-qt5-vlc
└─phonon-qt5
  └─phonon-qt5-vlc
Чтобы разобраться, посмотрел подробности:
$ pacman -Qi phonon-qt5 | egrep 'Name|Provides|Depends|Required'
Name            : phonon-qt5
Provides        : None
Depends On      : libpulse  qt5-base  phonon-qt5-backend
Required By     : phonon-qt5-vlc
Т.е. phonon-qt5 требуется для phonon-qt5-vlc, и при этом он зависит от phonon-qt5-backend.
НО пакета phonon-qt5-backend в системе нет
$ pacman -Qq phonon-qt5-backend
phonon-qt5-vlc
Провайдером для него выступает phonon-qt5-vlc:
$ pacman -Qi phonon-qt5-vlc | egrep 'Name|Provides|Depends|Required'
Name            : phonon-qt5-vlc
Provides        : phonon-qt5-backend
Depends On      : vlc  phonon-qt5
Required By     : phonon-qt5
Собственно, что получается?
Один и тот же пакет выступает и как клиент и как сервер для одного и того же пакета?
Т.е. phonon-qt5-vlc шлет запрос в phonon-qt5, а тот вполне может перенаправить запрос якобы в phonon-qt5-backend, а на деле в тот же phonon-qt5-vlc.
Это нормальная ситуация?
А как пакетный менеджер ведет себя при каскадных операциях?

У себя обнаружил шесть таких замыканий.
Например, посмотрите вот эти пары, если установлены пакеты:
mesa - libglvnd
$ pactree -d2 libglvnd
freetype2 <-> harfbuzz
$ pactree -d2 harfbuzz
usbmuxd <-> libimobiledevice
$ pactree -rd2 usbmuxd
Нет никакой циклической кольцевой зависимости. Начнем с уровня 1 на примере usbmuxd
pactree -d1 usbmuxd
usbmuxd
└─libimobiledevice
Видим всего одна зависимость от пакета libimobiledevice. Смотрим зависимость этого пакета
pacman -Qi libimobiledevice | grep Зависит
Зависит от : libusbmuxd usbmuxd gnutls
И это же показывает pactree -d2 usbmuxd (в этом выводе будет раскрыта зависимость libimobiledevice, точнее всех пакетов 1-го уровня и т.д.)
pactree -d2 usbmuxd
usbmuxd
└─libimobiledevice
├─libusbmuxd
├─usbmuxd
└─gnutls
usbmuxd даже находится на другом уровне, точнее относится к libimobiledevice.
Если понимать циклическую кольцевую зависимость дословно, то usbmuxd находился бы на 1-ом уровне (был бы в выводе pactree -d1 usbmuxd)

EDIT 1 - если посмотреть причину установки usbmuxd в выводе pacman -Qi usbmuxd, то увидим - "Установлен как зависимость другого пакета"
Ошибки не исчезают с опытом - они просто умнеют
vasek
Нет никакой циклической зависимости.
Вы прямо посте приводите пример циклической зависимости и утверждаете, что ее нет;))
$ pactree -d2 usbmuxd
usbmuxd
└─libimobiledevice
  ├─libusbmuxd
  ├─usbmuxd
  └─gnutls
Из usbmuxd мы идем в libimobiledevice и потом опять в usbmuxd.
Мы выходим из одного пакета, идем по зависимостям и попадаем в тот же пакет. Это и есть то, что теории графов называют циклом. Причем здесь количество уровней между ними?
И мне вот интересно, как пакетный менеджер разруливает эту ситуацию (а он ее, безусловно, разруливает).
Update. Термины: кольцо или цикл, или петля не важны, главное суть. Поправил заголовок.
Так запрограммирован pactree - показывает пакеты, которые зависят от данного пакета. Важен уровень 1, а дальше pactree расписывает зависимости пакетов находящихся на 1-ом уровне и так далее. А вот если указать pactree пакет, но этот пакет установлен как зависмость другого пакета (а не явно), то само собой в одном из уровней этот пакет и всплывет. Вроде все понятно, либо я плохо объясняю
Ошибки не исчезают с опытом - они просто умнеют
У меня есть свой скрипт, который отличается от pactree - он учитывает только явно установленные пакеты. Привожу его вывод
~/pct.sh
Всего пакетов в pkglist: 242
Какой пакет ищем? (какие пакеты явно зависят от данного): usbmuxd
gvfs-afc
Обработано пакетов: 242
Выявлено искомых пакетов: 1

Проверяем - pacman -Qi gvfs-afc
Зависит от : gvfs=1.36.2 libimobiledevice usbmuxd
Причина установки : Явно установлен
Ошибки не исчезают с опытом - они просто умнеют
определение циклических зависимостей

#!/bin/sh
pacman -Qdq | while read pkg; do
	pactree -lr $pkg | sed -n "1d;/^${pkg}$/p"
done

$ sudo pacman -R egl-wayland
проверка зависимостей...
ошибка: не удалось подготовить транзакцию (не удалось удовлетворить зависимости)
:: nvidia-utils: удаление egl-wayland ломает зависимость 'egl-wayland'

$ sudo pacman -Rc egl-wayland
проверка зависимостей...
:: vulkan-icd-loader опционально требует vulkan-driver: packaged vulkan driver
предупреждение: обнаружена циклическая зависимость:
предупреждение: nvidia-utils будет удалён после его зависимости egl-wayland
Хорошо бы какую-нибудь статейку ближе к первоисточнику найти.
В самих циклических зависимостях проблемы особой нет, просто тем, кто пишет скрипты по дереву зависимостей, нужно учитывать, что они могут быть. Но вот зачем в реальности это нужно, как-то я не понимаю.
Допустим, пишу я какую-то библиотеку вызываю функции из другой библиотеки (которая теперь будет у меня в зависимостях), и при этом я должен быть готов к тому, что из этой же библиотеки ко мне прилетят запросы на мои функции?
sirocco
$ sudo pacman -R egl-wayland
проверка зависимостей...
ошибка: не удалось подготовить транзакцию (не удалось удовлетворить зависимости)
:: nvidia-utils: удаление egl-wayland ломает зависимость 'egl-wayland'
Да, вот про это я и говорил, когда упоминал каскадные операции пакетного менеджера.
Вот в таких случаях циклические зависимости и должны проявляться (хотя лично я с проблемами не сталкивался).
Имхо я считаю - что разработчик заложил, то и получили. А он в pactree заложил полную раскладку зависимостей пакетов по уровням - на уровне n+1 указываются зависимости всех пакетов, приведенных на уровне n.
И разумеется будут случаи с неявно установленными пакетами, которые имеют в зависимостях (напрямую или через другие зависимые пакеты) требуемый (искомый) пакет, который и выскочит на каком-нибудь уровне. По идее, конечно, можно такие пакеты вычислить и учитывать их при последующей обработке, чтобы исключить проблемы.
Но так ли это важно и нужно? Не знаю. Каждый разработчик решает по своему.
UPD - лично я ни разу не попадал в такую ситуацию. А если и возникнет такая ситуация, то разобраться с ней, думаю, не проблема.
Ошибки не исчезают с опытом - они просто умнеют
Как я понимаю, именно для того, чтобы разрубить циклическую зависимость, и используется опция 'c' в операции удаления: pacman -Rc <пакет>.
Если в обычной ситуации хватает рекурсивного удаления с сохранением нужных зависимостей pacman -Rs, то циклическая зависимость не позволит это сделать. И тогда - только грубое снесение всего поддерева зависимостей для заданного пакета.
 
Зарегистрироваться или войдите чтобы оставить сообщение.