Есть ли способ получить дерево зависимостей из yum?

чтобы уменьшить вероятность проблемы XY, я пытаюсь установить PostGIS на чистую виртуальную установку RHEL5 с тяжелыми ограничениями. Я не знаю, есть ли у нас (как у компании) подписка на RH.

# yum install postgis
Loaded plugins: product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Install Process
No package postgis available.
Nothing to do.

он выдает ту же ошибку, когда я пытаюсь установить emacs, поэтому я относительно уверен, что не имеет значения, какой пакет я пытаюсь установить.

виртуальная машина имеет доступ в интернет.

все, что я хочу сделать, это получить полный граф зависимостей для часть программного обеспечения я указываю (очевидно, т. е. postgis). yum должен уже вычислить этот график зависимостей (или иметь один доступный для извлечения), чтобы выполнить свою работу, так как я могу подключиться к этому ресурсу?

4 ответов


на rhel5 и руководство по эксплуатации страница: "repoquery - это программа для запроса информации из репозиториев YUM аналогично запросам rpm."

для вашего конкретного случая postgis:

# repoquery --requires --recursive --resolve  postgis
postgresql-libs-0:8.1.23-6.el5_8.i386
geos-0:2.2.3-3.el5.i386
glibc-0:2.5-107.el5_9.5.i686
proj-0:4.5.0-3.el5.i386

вы можете упасть ".i386 "and".i686 " отключено от имен пакетов, Если ваша система 64-разрядная.

вывод из repoquery не идеален, так как, например, он не может перечислить glibc-common в приведенном выше списке. Но ваша система не будет запуск, если у него не было уже установленных glibc и glibc-common.

редактировать: хотя это не вызывает ошибки --recursive флаг, похоже, ничего не делает в RHEL5.11 и может быть опущено. Кроме того, используйте --pkgnarrow=all флаг, чтобы гарантировать, что все (установленные, доступные и т. д.) пакеты рассматриваются для запроса. Наконец, для одного шага рекурсии, чтобы получить больше дерева зависимостей, в оболочке bash передайте выходные данные команды repoquery второй команде repoquery используя tee и xargs вот так:

# repoquery --requires  --resolve --pkgnarrow=all postgis.i386 | tee >(xargs -r -n 1 -- repoquery --requires  --resolve --pkgnarrow=all) | sort | uniq
basesystem-0:8.0-5.1.1.noarch
geos-0:2.2.3-3.el5.i386
glibc-0:2.5-123.el5_11.3.i686
glibc-common-0:2.5-123.el5_11.3.i386
krb5-libs-0:1.6.1-80.el5_11.i386
libgcc-0:4.1.2-55.el5.i386
libstdc++-0:4.1.2-55.el5.i386
openssl-0:0.9.8e-40.el5_11.i686
postgresql-libs-0:8.1.23-10.el5_10.i386
proj-0:4.5.0-3.el5.i386

просто добавив улучшение к этому ответу, который я хотел бы быть здесь, когда я имел дело с этим.

добавление -- recursive ничего не делает при использовании --tree-requires

лучшим вариантом является . Это единственный способ, который я нашел, чтобы получить repoquery для обеспечения 100% полного дерева зависимостей,в том числе зависимостей зависимостей.

от человека: -- рекурсивный, когда используется с --whatrequires пакеты запрос рекурсивно.

насколько я могу судить, на --requires вернет тот же результат, как с, так и без .

если вы хотите получить список всех зависимостей, вы должны сделать repoquery --tree-requires <My-Package>. В противном случае у вас не будет всех необходимых зависимостей.

если вы хотите иметь их в удобном для чтения списке, вы можете выполнить эту команду:

sort <(sed -e 's/ [| \\_]\+\|-[[:digit:]]\+..*\|[[:digit:]]\://g' <(repoquery --tree-requires **YOUR-PACKAGE-HERE**)) | uniq

он будет создайте разборчивый, отсортированный, список только для имени пакета. Смотрите в этом примере с пакетом libxcb. Этот список содержит все зависимости и включает зависимости зависимостей.

Example with libxcb

Я не нашел никакой разницы в результатах с --recursive или --resolve когда не используется . --whatrequiresслужит другой цели, чем стандартное дерево зависимостей или список зависимостей. Я не нашел ответа на переполнение стека, который правильно объясняет это (есть некоторые замечания).

в настоящее время есть запрос функции для добавления команды "формат дерева" в repoquery, но на данный момент это не кажется вариантом. Надеюсь, это поможет заполнить пробел.


все, что я хочу сделать, это получить полный график зависимостей для части программного обеспечения, которое я указываю (очевидно, т. е. postgis).

для этого вы можете попробовать rpmreaper инструмент рекомендуется из этой статьи: Как проверить зависимости пакетов RPM от Fedora, CentOS или RHEL

Он предоставляет интерфейс на основе проклятий, который позволяет выборочно детализировать требования пакета или "детализировать" и посмотреть, что зависит на данном пакете.

типичный вывод ASCII на основе repoquery --tree-requires очень трудно следовать, когда это несколько уровней и тысячи строк. Дисплей rpmreaper гораздо легче читать и пересекать.

вот краткий пример использования " drill up "(он же "Required by"), чтобы найти цикл в Samba RPMs для справки:

samba-client-cycle


Это поможет очистить --tree-requires для (x86_64 с):

for i in `repoquery --tree-requires --recursive --resolve postgis \
  | perl -nle '/([a-z]+-\d+\.\d+((\.|\-)?\d+)?.*x86_64)/;print ""'`; \
  do yumdownloader $i; \
  done