Подтвердить что ты не робот

Есть ли способ получить дерево зависимостей от 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 должен уже вычислить этот граф зависимостей (или иметь один доступный для извлечения) для выполнения своей работы, поэтому как я могу использовать этот ресурс?

4b9b3361

Ответ 1

На страницах руководства 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" и ".686" от имен пакетов, если ваша система 64-разрядная.

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

EDIT. Хотя это и не вызывает ошибки, флаг --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

Ответ 2

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

ДОБАВИТЬ --recursive НЕ НИЧЕГО при использовании --tree-требует

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

FROM MAN: --рекурсивный, При использовании с --whatrequires рекурсивные пакеты запросов.

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

Если вы хотите получить список ВСЕХ зависимостей, вы ДОЛЖНЫ сделать repoquery --tree-requires <My-Package>. В противном случае у вас не будет всех необходимых зависимостей.

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

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

Он создаст разборчивый, отсортированный список только с именем пакета. См. Этот пример с пакетом libxcb. Этот список - это ВСЕ зависимости и включает зависимости зависимостей.

Пример с libxcb

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

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

Ответ 3

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

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

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

Типичный выход на основе repoquery --tree-requires на основе ASCII очень трудно отслеживать, когда он имеет несколько уровней глубины и тысячи строк. Дисплей rpmreaper намного легче читать и перемещаться.

Вот краткий пример использования "сверления" (также называемого "Требуется" ) для поиска цикла в RPM Samba для справки:

samba-client-cycle

Ответ 4

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

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