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

时间:2013-05-30 19:03:02

标签: 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-manager to register.
Setting up Install Process
No package postgis available.
Nothing to do.

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

虚拟机可以访问互联网。

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

4 个答案:

答案 0 :(得分:25)

根据 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,你的系统将无法运行。

编辑:虽然它不会导致错误,但--recursive标志似乎在RHEL5.11中什么都不做,可以省略。此外,使用--pkgnarrow=all标志可确保为查询考虑所有(已安装,可用等)包。最后,对于获取更多依赖关系树的一步递归,在bash shell中,使用teexargs将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

答案 1 :(得分:8)

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

添加 - 使用--tree-requires

时,递归无效

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

  

来自MAN: - 寄生,   与--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添加“树格式”命令,但此刻似乎不是一个选项。希望这有助于填补空白。

答案 2 :(得分:4)

  

我想要做的就是为我指定的软件检索一个完整的依赖图(很明显,即postgis)。

为此,您可以尝试使用本文推荐的 rpmreaper 工具:  How to check RPM package dependencies on Fedora, CentOS or RHEL

它提供了一个基于curses的界面,允许您有选择地深入了解包的要求或者#34;向上钻取&#34;并看看什么取决于给定的包。

基于ASCII的{{1}}的典型输出非常难以理解,因为它具有多个深度和数千行长。 rpmreaper显示更容易阅读和遍历。

以下是使用&#34;向上钻取&#34;的简短示例。 (又名&#34;&#34;要求)在Samba RPMs中找到一个循环以供参考:

samba-client-cycle

答案 3 :(得分:1)

这将有助于清除({x86_64)的--tree-requires

for i in `repoquery --tree-requires --recursive --resolve postgis \
  | perl -nle '/([a-z]+-\d+\.\d+((\.|\-)?\d+)?.*x86_64)/;print "$1"'`; \
  do yumdownloader $i; \
  done