如何递归列出需要安装的包的依赖项?

如何递归列出需要安装的包的依赖项?

当执行此操作时apt install,我会得到需要安装的软件包列表,位于以下行:

The following NEW packages will be installed:

如果没有,则继续,不提示。我尝试检索此列表,但如果没有,则会失败,因为安装将继续进行。我想获取此列表但不安装它。

我尝试了这样的事情:

apt-cache depends --recurse packagename | grep -v " " | sort -u

但是它给出了包括已安装的程序在内的完整列表。我想将其限制为需要安装的程序。

我知道我可以将上面的输出与

dpkg --get-selections

查看哪些已安装,哪些未安装,但这会涉及循环中的循环,并且两个列表都非常长。肯定有更优雅的方式来做到这一点。

谢谢您的任何建议。(这是我第一次在这里提问)

编辑:rdepends我检查了这个问题中给出的 方法:递归依赖

这本来就是我想要的,只是它得到的列表与给出的列表不同apt install。它甚至列出了可卸载的依赖项(如果软件包本身安装成功,则无法卸载)。我要找的是将apt在给定软件包之前安装的软件包列表。无论如何,我不明白为什么列表不同。它应该是相同的结果,对吧?但既然不是,那么它就不是我想要的。但是,如果有人能向我解释为什么它们会给出不同的结果,我将不胜感激。

答案1

使用:apt -s install ...

传递该-s选项会apt导致它模拟安装,但实际上不会安装或修改任何内容。这显示了您在安装包时可以看到的内容apt,包括引入了哪些包(如果有的话)来满足其(直接和间接)依赖关系。

例如,要了解安装apache2包时会发生什么,您可以运行:

apt -s install apache2

这向你展示了将采取哪些步骤sudo apt install apache2

-s选项也可以拼写为--simulate--just-print--dry-run--recon、中的任何一个--no-act。因此,如果您看到(或写出)其中任何一个,它们的作用是相同的。

-s选项记录在man apt-get而不是在man apt(后者没有记录大多数功能和选项),但和都apt-get -s install ...apt -s install ...支持。

您也可以使用 模拟其他动作-s,例如remove动作。

apt实际更改系统的命令不同,apt -s以 root 身份运行是可选的,因此您可以省略sudo

答案2

似乎apt -s install(从另一个答案) 可以满足您的需求。您可以考虑的其他工具是apt-rdependsapt-cache。但是,它们列出了 中的不同软件包apt -s install,因此使用哪个取决于您的需求。

  • apt可能包括标记为“建议”和“推荐”的包,具体取决于您的配置。

  • apt-rdepends不排除其他软件包已经提供的软件包。假设您xyz-ng安装了软件包,并且它提供了xyz。 apt-rdepends列出它,xyz因为它是依赖项,尚未安装,但apt不需要安装,xyz因为它是由已xyz-ng安装的提供的。

    • 在上面的例子中,xyz-ngxyz会发生冲突。因此,xyz如果不删除 ,则无法安装xyz-ng
  • apt-cache可能由于其他原因而包含不必要的包,例如其他架构(i386)。

以下是使用apt-rdepends输出管道传输到其他实用程序来清理包列表的示例:

package="whatever"
apt-rdepends \
        --state-follow=NotInstalled --state-show=NotInstalled \
        -f Depends -s Depends "$package" 2> /dev/null | 
    grep Depends\:\ | 
    sed -E 's@\ \(.*\)$@@ ; s@^\s+Depends\:\ @@' |
    sort -u

aptitude下面是使用管道输出清理包列表的示例:

package="whatever"
aptitude -s -y install "$package" |
    sed -E -e '1h;2,$H;$!d;g' \
           -e 's@(.*\n)+.*NEW\ packages\ will\ be\ installed:\n(.*\n).*RECOMMENDED but will NOT be installed:(\n.*)+@\2@' \
           -e 's@(\{[a-z]\})?\ @\n@g' |
    sort -u

答案3

你可以使用 aptitude 来实现这一点:

$ aptitude \
  --safe-resolver --no-new-installs install <package>

相关内容