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命令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
Run Code Online (Sandbox Code Playgroud)
在我处理这个问题时,只希望在这个答案中添加一个改进.
添加 - 使用--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包查看此示例.此列表是所有依赖项,包括依赖项的依赖项.
我发现在结果没有差异--recursive
或者--resolve
在不使用--whatrequires
命令.--whatrequires
与标准依赖关系树或依赖关系列表有不同的用途.我没有找到任何关于堆栈溢出的答案,正确解释了这一点(有一些评论).
目前有一个功能请求是向repoquery添加"树格式"命令,但此刻似乎不是一个选项.希望这有助于填补空白.
我要做的就是为我指定的软件(显然是postgis)检索完整的依赖关系图。
为此,您可以尝试本文推荐的rpmreaper工具: 如何检查Fedora,CentOS或RHEL上的RPM软件包依赖性
它提供了一个基于curses的界面,使您可以有选择地深入研究软件包的要求或“深入研究”,并查看什么取决于给定的软件包。
基于ASCII的典型输出在repoquery --tree-requires
几层深度和数千行长度时很难遵循。rpmreaper显示更加易于阅读和遍历。
这是使用“向上钻取”(也称为“必填”)在Samba RPM中查找循环的简要示例,以供参考:
归档时间: |
|
查看次数: |
40566 次 |
最近记录: |