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

bam*_*amm 5 package-management command-line apt

这样做时apt install,我会在以下行下获得需要安装的软件包列表:

The following NEW packages will be installed:
Run Code Online (Sandbox Code Playgroud)

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

我试过这样的事情:

apt-cache depends --recurse packagename | grep -v " " | sort -u
Run Code Online (Sandbox Code Playgroud)

但它提供了一个完整的列表,包括那些已经安装的列表。我想将其限制为需要安装的那些。

我知道我可以将上面的输出与结果进行比较

dpkg --get-selections
Run Code Online (Sandbox Code Playgroud)

查看哪些已安装,哪些未安装,但这将涉及循环内的循环,并且两个列表都很长。肯定必须有一种更优雅的方式来做到这一点。

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

编辑:我使用rdepends这个问题中给出的方法检查了方法: Recursive dependencies

这将是我正在寻找的,只是它会导致与apt install给出的列表不同。它甚至列出了可卸载的依赖项(这是不可能的,因为包本身已成功安装)。我正在寻找的是apt将在给定包之前安装的包列表。无论如何,我不明白为什么列表不同。结果应该是一样的吧?但既然不是,那么这不是我要找的。但是,如果有人能向我解释为什么他们给出不同的结果,我将不胜感激。

Eli*_*gan 8

用: apt -s install ...

传递-s选项以apt使其模拟安装但不实际安装或修改任何内容。这显示了您apt在安装软件包时可以期望看到的内容,包括引入哪些软件包以满足其(直接和间接)依赖项。

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

apt -s install apache2
Run Code Online (Sandbox Code Playgroud)

这将向您显示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.


xio*_*ota 5

似乎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通过管道传输到其他实用程序以清理包列表的with 输出的示例用法:

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
Run Code Online (Sandbox Code Playgroud)

这是一个使用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
Run Code Online (Sandbox Code Playgroud)