有没有办法从yum中检索依赖树?

Sea*_*red 27 dependencies yum package-managers dependency-management

为了减少XY问题的可能性,我正在尝试在严格限制的干净,虚拟RHEL5安装上安装PostGIS.我不知道我们(作为公司)是否有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.
Run Code Online (Sandbox Code Playgroud)

当我尝试安装时emacs,它会抛出相同的错误,所以我相对肯定我正在尝试安装哪个包并不重要.

VM可以访问Internet.

我想要做的就是为我指定的软件检索一个完整的依赖图(显然,即postgis).yum必须已经计算出这个依赖图(或者有一个可用于检索)来完成它的工作,那么我该如何利用这个资源呢?

ZaS*_*ter 27

根据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
Run Code Online (Sandbox Code Playgroud)

如果系统是64位,则可以从软件包名称中删除".i386"和".i686".

repoquery的输出并不完美,因为例如,它无法在上面的列表中列出glibc-common.但如果没有安装glibc和glibc-common,你的系统将无法运行.

编辑:虽然它不会导致错误,但--recursive标志似乎在RHEL5.11中什么都不做,可以省略.此外,使用该--pkgnarrow=all标志可确保为查询考虑所有(已安装,可用等)包.最后,对于递归获得更多的依赖关系树中的一个步骤,在bash外壳,repoquery命令的输出使用传递给第二个repoquery命令teexargs像这样:

# 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
Run Code Online (Sandbox Code Playgroud)

  • `--recursive`标志仅适用于`--whatrequires`选项,而不适用于`--requires`.提供的答案(`--recursive --requires`)将仅列出您要查询的包所需的那些包.似乎唯一的`repoquery`命令将提供递归解析,如果`--treerequires`.输出将需要进一步处理以去除ascii艺术并制作最小列表. (4认同)
  • 正确的标志是“ --tree-requires”。 (2认同)

njf*_*ife 8

在我处理这个问题时,只希望在这个答案中添加一个改进.

添加 - 使用--tree-requires时,递归没有任何作用

最好的选择是--tree-requires选项.这是我发现获得repoquery以提供100%完整依赖关系树的唯一方式,包括依赖关系的依赖关系.

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
Run Code Online (Sandbox Code Playgroud)

它将生成一个清晰,有序,仅包名称列表.使用libxcb包查看此示例.此列表是所有依赖项,包括依赖项的依赖项.

libxcb的示例

我发现在结果没有差异--recursive或者--resolve在不使用--whatrequires命令.--whatrequires与标准依赖关系树或依赖关系列表有不同的用途.我没有找到任何关于堆栈溢出的答案,正确解释了这一点(有一些评论).

目前有一个功能请求是向repoquery添加"树格式"命令,但此刻似乎不是一个选项.希望这有助于填补空白.


Mar*_*ton 5

我要做的就是为我指定的软件(显然是postgis)检索完整的依赖关系图。

为此,您可以尝试本文推荐的rpmreaper工具: 如何检查Fedora,CentOS或RHEL上的RPM软件包依赖性

它提供了一个基于curses的界面,使您可以有选择地深入研究软件包的要求或“深入研究”,并查看什么取决于给定的软件包。

基于ASCII的典型输出在repoquery --tree-requires几层深度和数千行长度时很难遵循。rpmreaper显示更加易于阅读和遍历。

这是使用“向上钻取”(也称为“必填”)在Samba RPM中查找循环的简要示例,以供参考:

samba-client-cycle