【发布时间】:2014-03-27 07:43:12
【问题描述】:
我需要列出/下载一个 debian 包的所有递归依赖项。
假设我需要安装包 a.deb,它依赖于包 b.deb,包 b.deb 又依赖于包 c.deb。
我需要下载所有递归依赖包,以便它们可以安装在其他机器上,而无需任何互联网访问。
谢谢。
【问题讨论】:
标签: dependencies package debian
我需要列出/下载一个 debian 包的所有递归依赖项。
假设我需要安装包 a.deb,它依赖于包 b.deb,包 b.deb 又依赖于包 c.deb。
我需要下载所有递归依赖包,以便它们可以安装在其他机器上,而无需任何互联网访问。
谢谢。
【问题讨论】:
标签: dependencies package debian
由于某种原因,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
(您显然必须将行尾的<your-package-here>更改为您要分析的包)
这里的关键是--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
【讨论】:
--no-pre-depends?我认为需要安装 pre-depends。
您可以使用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。
【讨论】:
正如midihenry 指出的那样 - 安装 apt-rdepends 包然后运行它
$ apt-rdepends gcc | awk '$1 ~ /^Depends:/{print $2}' | xargs apt-get download
这一行将递归获取所有依赖项,并查看第二个管道,将从 stdio 按名称下载所有包,这就是该行 -
awk $1 ~ /^Depends:/{print $2} 可以。打印出包的名称。如果你附加地运行这些命令,你就会明白我的意思了。
【讨论】:
这是一个 bash 命令,用于下载 debian 包及其递归依赖项。与其他答案不同,如果无法下载 apt-rdepends 返回的包之一,则此命令不会失败。
for PKG in $(apt-rdepends <package> | grep -v "^ "); do apt download $PKG; done
【讨论】: