如何列出/下载 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
(您显然必须将行尾的<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
【讨论】:
一旦你知道你需要的依赖,你可以编辑/etc/apt/sources.list并添加/etc/apt/preferences.d/somename.pref,如果离线的机器有一个较新的(它不适用于较旧的,我试过)版本的 Ubuntu。请参阅:medium.com/@george.shuklin/… 这太棒了!非常感谢!我想补充一点,我必须对安装进行以下更改才能在我的 Ubuntu 18.04 全新安装上运行: echo "deb [allow-insecure=yes] file:--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 包的递归依赖项?的主要内容,如果未能解决你的问题,请参考以下文章
在 Debian 或 Ubuntu 下自动获取构建依赖项的 Debian 方式是啥? [关闭]