web-dev-qa-db-fra.com

Existe-t-il un moyen de récupérer un arbre de dépendance à partir de yum?

Pour réduire le risque de problème XY, j'essaie d'installer PostGIS sur une installation RHEL5 propre et virtuelle avec de lourdes restrictions. Je ne sais pas si nous (en tant qu'entreprise) avons un abonnement 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.

Il génère la même erreur lorsque j'essaie d'installer emacs, donc je suis relativement certain que peu importe le package que j'essaie d'installer.

Le VM a accès à Internet.

Tout ce que je veux faire, c'est récupérer un graphique de dépendance complet pour un logiciel que je spécifie (évidemment, c'est-à-dire postgis). yum doit déjà calculer ce graphique de dépendance (ou en avoir un disponible pour la récupération) pour faire son travail, alors comment puis-je puiser dans cette ressource?

27
Sean Allred

Selon les pages du manuel RHEL5: "repoquery est un programme pour interroger les informations des référentiels YUM de la même manière que les requêtes rpm."

Pour votre cas spécifique de 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

Vous pouvez supprimer les ".i386" et ".i686" des noms de package si votre système est en 64 bits.

Le résultat du repoquery n'est pas parfait car, par exemple, il ne parvient pas à lister glibc-common dans la liste ci-dessus. Mais votre système ne fonctionnerait pas s'il n'avait pas à la fois glibc et glibc-common déjà installés.

EDIT : Bien que cela ne provoque pas d'erreur, le --recursive flag semble ne rien faire dans RHEL5.11 et peut être omis. Utilisez également le --pkgnarrow=all flag pour garantir que tous les packages (installés, disponibles, etc.) sont pris en compte pour la requête. Enfin, pour une étape de récursivité pour obtenir plus de l'arborescence des dépendances, dans un shell bash, passez la sortie de la commande repoquery à une deuxième commande repoquery en utilisant tee et xargs comme ceci:

# 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
27
ZaSter

J'ajoute simplement une amélioration à cette réponse que j'aurais aimé être ici lorsque je m'occupais de cela.

ADDING --recursive ne fait RIEN lorsque vous utilisez --tree-requires

La meilleure option est le --tree-requires option. C'est la SEULE façon que j'ai trouvée pour que le repoquery fournisse un arbre de dépendance complet à 100%, y compris les dépendances des dépendances.

FROM MAN: --recursive, Lorsqu'il est utilisé avec --whatrequires , interroge les packages de manière récursive.

Autant que je sache, pour un --requires renverra le même résultat, avec et sans le --recursive option.

Si vous voulez obtenir une liste de TOUTES les dépendances, vous DEVEZ faire un repoquery --tree-requires <My-Package>. Sinon, vous n'aurez pas toutes les dépendances requises.

Si vous voulez les avoir dans une liste facile à lire, vous pouvez exécuter cette commande:

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

Il produira une liste lisible, triée et contenant uniquement le nom du package. Voir cet exemple avec le package libxcb. Cette liste est TOUTES les dépendances et inclut les dépendances des dépendances.

Example with libxcb

Je n'ai trouvé aucune différence dans les résultats avec --recursive ou --resolve lorsque vous n'utilisez pas le --whatrequires commande. --whatrequiresserve un objectif différent de celui d'une arborescence de dépendances standard ou d'une liste de dépendances. Je n'ai trouvé aucune réponse sur le débordement de pile qui explique correctement cela (il y a quelques commentaires).

Il existe actuellement une demande de fonctionnalité pour ajouter une commande "format d'arbre" au repoquery, mais pour le moment cela ne semble pas être une option. Espérons que cela aide à combler le vide.

8
njfife

Tout ce que je veux faire, c'est récupérer un graphique de dépendance complet pour un logiciel que je spécifie (évidemment, c'est-à-dire postgis).

Pour cela, vous pouvez essayer l'outil rpmreaper recommandé dans cet article: Comment vérifier les dépendances des packages RPM sur Fedora, CentOS ou RHEL =

Il fournit une interface basée sur des malédictions qui vous permet d'explorer de manière sélective les exigences d'un package ou de "développer" et de voir ce qui dépend d'un package donné.

La sortie typique du ASCII based repoquery --tree-requires est très difficile à suivre lorsqu'il est profond de plusieurs niveaux et long de milliers de lignes. L'affichage rpmreaper est beaucoup plus facile à lire et à parcourir.

Voici un bref exemple d'utilisation du "drill up" (aka "Requis par") pour trouver un cycle dans les RPM Samba pour référence:

samba-client-cycle

5
Mark Edington

Cela aidera à nettoyer le --tree-requires pour (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
1
John Doe