如何列出/下载 debian 包的递归依赖项?

Posted

技术标签:

【中文标题】如何列出/下载 debian 包的递归依赖项?【英文标题】:How to list/download the recursive dependencies of a debian package? 【发布时间】:2014-03-27 07:43:12 【问题描述】:

我需要列出/下载一个 debian 包的所有递归依赖项。

假设我需要安装包 a.deb,它依赖于包 b.deb,包 b.deb 又依赖于包 c.deb。

我需要下载所有递归依赖包,以便它们可以安装在其他机器上,而无需任何互联网访问。

谢谢。

【问题讨论】:

相关:askubuntu.com/questions/468753/recursive-dependencies 【参考方案1】:

由于某种原因,apt-rdepends 对我不起作用(在搜索“docker-engine”包时,它错过了对 libltdl7 的依赖,它是由 docker-engine 1.11.1-0 引入的)。 UPD 可能是因为apt-rdepends 默认不关注也不列出推荐。并且不遵循虚拟包。

所以我想出了以下命令套件。

递归列出依赖项

$ apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u

(您显然必须将行尾的&lt;your-package-here&gt;更改为您要分析的包)

这里的关键是--recurse 选项。不幸的是,您无法指定您想要的内容(或者我没有找到方法),因此您需要关闭所有不需要的依赖项以仅保留“依赖项”。有点冗长,难记!

来自 apt-cache 手册页:

默认情况下,depends 和 rdepends 打印所有依赖项

下载这些依赖项

因此,为了下载这些依赖项,请运行以下命令,将它们下载到当前工作目录:

$ apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u)

(可选)安装这些依赖项

这略微扩展了所提出的问题,但它似乎与问题的意图相匹配。

你需要为刚刚下载的包建立index。这是从下载所有 .deb 的同一文件夹中完成的:

$ dpkg-scanpackages . | gzip -9c > Packages.gz

然后将该文件夹(所有 .deb + Packages.gz 文件)复制到无法访问 Internet 的目标系统,并将该文件夹添加到 APT 源列表。

$ echo "deb file:<your folder here> ./" | sudo tee -a /etc/apt/sources.list
$ sudo apt-get update

等等

在没有 Internet 访问的系统上,我可以安装一个包(在我的示例中为 Docker)及其依赖项:

$ sudo apt-get install docker-engine

【讨论】:

一旦你知道你需要的依赖,你可以编辑/etc/apt/sources.list并添加/etc/apt/preferences.d/somename.pref,如果离线的机器有一个较新的(它不适用于较旧的,我试过)版本的 Ubuntu。请参阅:medium.com/@george.shuklin/… 这太棒了!非常感谢!我想补充一点,我必须对安装进行以下更改才能在我的 Ubuntu 18.04 全新安装上运行: echo "deb [allow-insecure=yes] file: ./" | sudo tee -a /etc/apt/sources.list 和 sudo apt-get install --allow-unauthenticated docker-engine 你也可以使用 "deb [trusted=yes] file:/your/folder/path/here/ ./" 这样我就不需要使用 "--allow-unauthenticated " 在我的 apt 命令中。 为什么使用--no-pre-depends?我认为需要安装 pre-depends。 @SteelyWing 你是对的:我相应地编辑了答案。谢谢!【参考方案2】:

您可以使用apt-rdepends 以递归方式获取包的所有依赖项。通过将结果传递给 grep,您可以只获得包名并省略不需要的信息。

示例

 $ apt-rdepends cowsay | grep -E '^[a-zA-Z0-9]'

输出

cowsay
perl
libbz2-1.0
libc6
libgcc1
gcc-4.9-base
multiarch-support
libdb5.3
libgdbm3
dpkg
liblzma5
libselinux1
libpcre3
tar
libacl1
libattr1
zlib1g
install-info
perl-base
perl-modules

然后您可以使用apt-get download $package 下载这些软件包,并将它们离线安装到您的机器上。

默认情况下,apt 安装 Recommends,因此您可能希望像这样运行 apt-rdepends

apt-rdepends -f Depends,PreDepends,Recommends -s Depends,PreDepends,Recommends cowsay

由于apt-rdepends 默认跟随并仅显示 Depends、PreDepends。

【讨论】:

【参考方案3】:

正如midihenry 指出的那样 - 安装 apt-rdepends 包然后运行它

$ apt-rdepends gcc | awk '$1 ~ /^Depends:/print $2' | xargs apt-get download

这一行将递归获取所有依赖项,并查看第二个管道,将从 stdio 按名称下载所有包,这就是该行 -

awk $1 ~ /^Depends:/print $2 可以。打印出包的名称。如果你附加地运行这些命令,你就会明白我的意思了。

【讨论】:

【参考方案4】:

这是一个 bash 命令,用于下载 debian 包及其递归依赖项。与其他答案不同,如果无法下载 apt-rdepends 返回的包之一,则此命令不会失败。

for PKG in $(apt-rdepends <package> | grep -v "^ ");  do apt download $PKG; done

【讨论】:

以上是关于如何列出/下载 debian 包的递归依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

列出 R 包依赖项而不安装包

Python 包依赖树

如何从 PyPi 包中提取依赖项

在 Debian 或 Ubuntu 下自动获取构建依赖项的 Debian 方式是啥? [关闭]

在Debian上安装TeamViewer 13需要很多依赖项

如何在不安装的情况下列出python库的依赖项? [复制]