安装软件时如何查找依赖项?

Luk*_*rns 1 ubuntu installation dependencies

在软件安装教程中,它们总是有很长的依赖项列表。他们如何找到这些依赖关系?

例如,我正在一个全新的 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;
Run Code Online (Sandbox Code Playgroud)

我只想了解他们如何找到所有这些依赖项。复制粘贴是可以的,但我觉得理解它更重要。

And*_*ith 5

每个包都带有自己的依赖项列表。对于Ubuntu 使用的debs,您可以执行以下操作:-

[andys@daedalus ~]$ apt-cache depends git-core
git-core
  Depends: git
Run Code Online (Sandbox Code Playgroud)

包的依赖关系是在构建包时指定的。其中一些是由包维护者(负责构建包的人)手动指定的,有些是在构建包时自动确定的。如果你下载一个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
Run Code Online (Sandbox Code Playgroud)

...你会看到它git本身有更多的依赖。更复杂的是,除了需要安装另一个包之外,还有不同类型的依赖项......

  • 冲突- 此软件包与另一个软件包冲突,如果不卸载此软件包,您可能无法安装冲突的软件包,反之亦然。在这种情况下,gitgit-core. 在我这里的盒子上,git-core包裹被标记为obsolete,这可能是这里列出的原因。
  • Breaks - 这个包破坏了另一个包,并且安装它 - 虽然可能不需要你卸载将被破坏的包 - 会导致该包安装的软件出现问题。再看看我们的例子,一旦安装了stgitstgit-contrib包就会被认为是损坏的git
  • 替换- 此包替换另一个包,这意味着另一个包已过时并且可能可以卸载。该git-core软件包将显示再次在这里。

还有一些“软”依赖类型,例如RecommendsSuggests,它们不是您正在安装的软件包所必需的,但正如其名称所暗示的那样是推荐建议的。再次查看示例,建议和推荐的包是 git 的附加组件,或者是不直接相关的工具,它们将使使用更容易。

将所有这些放在一起,您使用的包管理器将从您要求它安装的包(或多个包)开始,并将查找它的依赖项,然后是这些包的所有依赖项,依此类推。它还将检查冲突、破坏或替换请求的包或其依赖项的包。一旦它找到了一种可以满足您最初要求的方式感到高兴,它就会继续安装。

不同的包管理器有不同的方式来解决这个依赖关系apt-getaptitudedselect,例如,基本上都做同样的事情,但他们做出决定的方式不同。您可能会发现这一点,aptitude并且很dselect乐意为您提供一种安装软件包的方法,而apt-get不能。

如果您有兴趣了解有关 Debian 软件包的更多信息,请查看Debian 新维护者指南,其中介绍了 debs 的一些内容。

  • +1。彻底,清楚。 (2认同)