web-dev-qa-db-ja.com

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をインストールしようとすると同じエラーがスローされるため、どのパッケージをインストールしようとしているかは問題ではないと確信しています。

VMはインターネットにアクセスできます。

私がやりたいのは、指定したソフトウェアの完全な依存関係グラフを取得することです(明らかに、postgis)。 yumは、ジョブを実行するためにこの依存関係グラフをすでに計算している(または取得可能なグラフを1つ持っている)必要があります。

27
Sean Allred

RHEL5マニュアルページ:「repoqueryは、rpmクエリと同様にYUMリポジトリから情報をクエリするプログラムです。」

特定の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

システムが64ビットの場合、パッケージ名から「.i386」と「.i686」を削除できます。

Repoqueryからの出力は、たとえば、上記のリストにglibc-commonをリストできないため、完全ではありません。ただし、glibcとglibc-commonの両方がインストールされていない場合、システムは実行されません。

[〜#〜] edit [〜#〜]:エラーは発生しませんが、--recursiveフラグはRHEL5.11では何もしないようで、省略できます。また、--pkgnarrow=allフラグは、すべての(インストール済み、使用可能など)パッケージがクエリで考慮されるようにします。最後に、bashシェルでより多くの依存関係ツリーを取得する再帰の1ステップで、teeおよびxargsを使用してrepoqueryコマンドの出力を2番目のrepoqueryコマンドに渡します。

# 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

私がこれを扱っていたときにここにいればよかったと思うこの答えに改善を加えるだけです。

ADDING --recursiveは--tree-requiresの使用時にNOTHINGを行いません

最適なオプションは--tree-requiresオプションです。それが、依存関係の依存関係を含む100%完全な依存関係ツリーを提供するrepoqueryを取得する唯一の方法です

FROM MAN:--recursive、--whatrequiresとともに使用すると、パッケージを再帰的にクエリします。

私が知る限り、--requires--recursiveオプションの有無にかかわらず同じ結果を返します。

すべての依存関係のリストを取得する場合は、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の結果に違いはありません。 --whatrequiresは、標準の依存関係ツリーまたは依存関係リストとは異なる目的を果たします。これを正しく説明するスタックオーバーフローに関する回答は見つかりませんでした(コメントがあります)。

現在、「ツリー形式」コマンドをrepoqueryに追加する機能要求がありますが、現時点ではオプションではないようです。うまくいけば、これがギャップを埋めることに役立ちます。

8
njfife

私がやりたいのは、指定したソフトウェア(明らかにpostgis)の完全な依存関係グラフを取得することだけです。

このために、この記事から推奨されるrpmreaperツールを試してみてください: Fedora、CentOS、またはRHELでのRPMパッケージの依存関係を確認する方法 =

パッケージの要件に選択的にドリルダウンするか、「ドリルアップ」して特定のパッケージに依存するものを確認できるcursesベースのインターフェースを提供します。

ASCII based repoquery --tree-requiresは、数レベルの深さと数千行の長さがある場合、追跡するのが非常に困難です。 rpmreaperの表示は読みやすく、移動しやすいです。

「ドリルアップ」(別名「必須」)を使用して、参照用のSamba RPMでサイクルを見つける簡単な例を次に示します。

samba-client-cycle

5
Mark Edington

これにより、--tree-requires for(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