在软件安装教程中,总是会列出一长串的依赖项。他们如何找到这些依赖项?
例如,我在一台全新的 Ubuntu 服务器上开始操作,按照说明安装 rvm。它们提供了类似以下内容的内容:
sudo apt-get install git-core libreadline5 libncurses5-dev libreadline5-dev build-essential zlib1g-dev libssl-dev libpcre3-dev libxml2-dev libxslt-dev;
我只是想了解他们如何找到所有这些依赖项。复制和粘贴是可行的,但我认为理解它更重要。
答案1
通常 apt 会为您完成该操作。如果您尝试安装具有未满足依赖关系的二进制包,apt 会告诉您缺少哪些依赖关系,并请求您允许安装它们。
大多数源发行版都会在 README 文件中告诉您 -dev 依赖项是什么。
答案2
每个包都带有其自己的依赖项列表。对于德布斯,Ubuntu 使用的,您可以执行以下操作:-
[andys@daedalus ~]$ apt-cache depends git-core
git-core
Depends: git
软件包的依赖项在软件包构建时指定。其中一些由软件包维护者(负责构建软件包的人),还有一些在构建软件包时自动确定。如果您下载 Debian 源包并查看文件debian/control
,您会看到许多行,如Depends:
、Conflicts:
、Replaces:
等。
那么,回到示例 -git-core
仅依赖于一个包,即git
。git
可能是某种元包,而元包又具有大量依赖项,以确保安装了运行 git 所需的所有包 - 而不仅仅是满足一个包的依赖项。如果我们查看包git
:-
[andys@daedalus ~]$ apt-cache depends git
git
Depends: libc6
Depends: libcurl3-gnutls
<...snip...>
Suggests: git-cvs
Suggests: git-svn
Suggests: git-email
<...snip...>
Recommends: rsync
<...snip...>
Conflicts: git-core
<...snip...>
Breaks: stgit
Breaks: stgit-contrib
Replaces: <cogito>
Replaces: git-core
...你会发现它git
本身还有进一步的依赖关系。更复杂的是,除了需要安装另一个包之外,还有不同类型的依赖关系……
- 冲突- 此软件包与另一个软件包冲突,如果不卸载此软件包,您可能无法安装冲突的软件包,反之亦然。在本例中,
git
与 冲突git-core
。在我的计算机上,该git-core
软件包被标记为过时的,这可能就是为什么将其列在这里的原因。 - 休息- 此软件包会破坏另一个软件包,安装此软件包(尽管可能不需要卸载将被破坏的软件包)会导致该软件包安装的软件出现问题。再次查看我们的示例,一旦安装,
stgit
和stgit-contrib
软件包将被视为已破坏。git
- 替换- 此软件包替换了另一个软件包,这意味着另一个软件包已过时,可能可以卸载。此
git-core
软件包再次出现在这里。
还有“软”依赖类型,例如建议和建议,但不是必需的由你正在安装的软件包决定,但受到推崇的或者建议,顾名思义。再次查看示例,建议和推荐的软件包是 git 的附加组件,或不直接相关的工具,可以使使用更容易。
综上所述,您使用的包管理器将首先从您要求其安装的包开始,然后查找其依赖项,然后查找这些包的任何依赖项,依此类推。它还将检查与请求的包或其依赖项发生冲突、破坏或替换的包。一旦它找到可以满足您原始请求的方法,它将继续安装。
不同的包管理器有不同的方法来实现这一点依赖解析例如apt-get
,aptitude
和dselect
本质上都做同样的事情,但它们做出决定的方式不同。您可能会发现aptitude
和dselect
会很乐意向您介绍一种安装包的方法,而apt-get
却不能。
如果你有兴趣了解更多关于 Debian 软件包的信息,请查看Debian 新维护者指南,其中详细介绍了 debs 的一些内容。