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

Dependencies 有没有办法从yum中检索依赖关系树?,dependencies,dependency-management,yum,package-managers,Dependencies,Dependency Management,Yum,Package Managers,为了减少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-manage

为了减少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.
当我尝试安装
emacs
时,它会抛出相同的错误,因此我相对确定,我尝试安装哪个软件包并不重要

虚拟机可以访问internet


我所要做的就是为我指定的软件检索一个完整的依赖关系图(很明显,即
postgis
yum
必须已经计算了此依赖关系图(或有一个可供检索的依赖关系图)才能完成其工作,那么我如何才能利用此资源?

请参见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
如果您的系统是64位的,则可以从包名称中删除“.i386”和“.i686”

repoquery的输出并不完美,例如,它无法在上面的列表中列出glibc common。但是,如果您的系统没有同时安装glibc和glibc common,它将不会运行

编辑:虽然不会导致错误,但在RHEL5.11中,
--recursive
标志似乎没有任何作用,可以忽略。另外,使用
--pkgnarrow=all
标志确保查询时考虑所有(已安装、可用等)软件包。最后,对于获取更多依赖关系树的递归步骤,在bash shell中,使用
tee
xargs
将repoquery命令的输出传递给第二个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

这将有助于清理(x86_64)的
--树要求

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

为此,您可以尝试本文推荐的rpmreaper工具:

它提供了一个基于curses的界面,允许您有选择地深入到包的需求或“向上钻取”,并查看依赖于给定包的内容

基于ASCII的
repoquery——tree requires
的典型输出在几层深、数千行长的情况下很难遵循。rpmreaper显示屏更易于阅读和浏览

下面是一个使用“钻取”(又名“Required by”)在Samba RPM中查找循环的简要示例,以供参考:


只是对这个答案做了一点改进,我希望在处理这个问题时能在这里

使用--tree requires时添加--recursive不起任何作用

最好的选择是
——树需要
选项。这是我找到的让repoquery提供100%完整的依赖关系树(包括依赖关系的依赖关系)的唯一方法

来自人类:——递归, 与--whatrequires一起使用时,递归查询包

据我所知,对于
--requires
,无论是否使用
--recursive
选项,都将返回相同的结果

如果要获得所有依赖项的列表,必须执行
repoquery——树需要
。否则,您将没有所有必需的依赖项

如果要将它们放在易于阅读的列表中,可以运行以下命令:

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

排序如果没有对存储库的redhat订阅,依赖项列表将毫无用处。您可能想改用CentOS 5 five,因为它是RHEL5,没有红帽商标,订阅是免费的。@ZaSter山姆大叔显然喜欢使用免费的东西。CentOS有其局限性,但在很大程度上我同意你的看法。我需要依赖项列表,这样我就可以手动下载它们,将它们推到ISO上,然后将它们放到vm上。“yum repolist”将告诉您是否有任何可用的yum存储库(通过订阅或其他方式)。如果没有,则没有可通过yum安装的软件包。如果您是从“干净的、虚拟的”安装开始的,则不会有任何问题。CentOS和大多数其他Linux平台提供公共回购,并将其集成到基本安装中。由于RHEL更新是在订阅之后进行的,因此您无法获得该更新。在克隆的VM映像上共享同一订阅将取消订阅,因此您也不能真正这样做。解决方案如下所述:
--recursive
标志仅适用于
--whatrequires
选项,而不适用于
--requires
。提供的答案(
--recursive--requires
)将只列出您要查询的包直接需要的那些包。似乎只有
repoquery
命令在
--treeRequests
时提供递归解析。输出将需要一些进一步的处理来去除ascii艺术并生成一个最小的列表。原始问题的RHEL5/CentOS5环境中不存在--tree requires标志。奇怪的是,--recursive标志在当前RHEL5手册页面中没有定义,也不是必需的,但不会产生错误。这实际上有一些错误,并且不会总是提供准确的列表。一些包名被截断了。我发现你的答案很有用,但是你正在形成你的命令有点奇怪。我会用管道从左到右流动,而不是像下面这样的临时文件句柄:
repoquery——tree需要**YOUR-PACKAGE-HERE**sed-e/[\\\\\\\\\\\\\\\\\\\\\\\\\\+\\\\\\\\\\\\\\\\\\\\\\\\\\[:digit:][]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[[
sort <(sed -e 's/ [| \\\_]\+\|-[[:digit:]]\+..*\|[[:digit:]]\://g' <(repoquery --tree-requires **YOUR-PACKAGE-HERE**)) | uniq