32

为了减少出现 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 可以访问 Internet。

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

4

4 回答 4

30

根据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 中,将 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
于 2013-06-14T20:36:36.227 回答
10

只需对这个答案进行改进,我希望在处理这个问题时就在这里。

使用 --tree-requires 时添加 --recursive 什么都不做

最好的选择就是--tree-requires选项。这是我发现让 repoquery 提供 100% 完整的依赖关系树的唯一方法,包括 dependencies 的依赖关系

FROM MAN: --recursive, 当与 --whatrequires 一起使用时,递归查询包。

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

如果要获取所有依赖项的列表,则必须执行repoquery --tree-requires <My-Package>. 否则,您将不会拥有所有必需的依赖项。

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

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

它将生成一个清晰的、排序的、仅包含包名的列表。请参阅这个带有 libxcb 包的示例。此列表是所有依赖项,并且包括依赖项的依赖项。

libxcb 示例

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

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

于 2017-02-16T23:13:59.443 回答
10

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

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

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

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

以下是使用“drill up”(又名“Required by”)在 Samba RPM 中查找循环以供参考的简短示例:

samba 客户端循环

于 2016-09-22T15:09:24.933 回答
1

这将有助于清理--tree-requiresfor (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
于 2016-05-13T20:51:38.057 回答