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

时间:2014-02-25 08:13:08

标签: dependencies package debian

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

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

我需要下载所有递归依赖软件包,以便可以在没有任何Internet访问权限的情况下将它们安装在其他计算机上。

感谢。

4 个答案:

答案 0 :(得分:41)

由于某种原因,true对我不起作用(搜索'docker-engine'软件包时,它错过了apt-rdepends引入的libltdl7依赖项。

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

递归列出依赖项

docker-engine 1.11.1-0

(你显然必须在你想要分析的包的行尾改变$ apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances <your-package-here> | grep "^\w" | sort -u

此处的关键是<your-package-here>选项。不幸的是,你无法指定你想要的内容(或者我没有找到方法)所以你需要关闭所有不需要的依赖项以仅保留“依赖项”。它有点冗长,难以记住!

从apt-cache手册页:

  

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

下载这些依赖项

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

--recurse

(可选)安装这些依赖项

这略微延伸了问题,但似乎与问题的意图相符。

您需要构建刚刚下载的软件包的索引。这是从所有.deb下载的文件夹中完成的:

$ 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)

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

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

Etvoilà

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

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

答案 1 :(得分:6)

您可以使用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下载这些软件包,并在您的计算机上脱机安装。

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:0)

如果您只想下载Debian软件包,那么:

apt-get -d package

apt-get download package

否则,如果您只想要一个包的依赖项列表:

apt-cache depends package

显然,将package替换为您要查询的包名称。