为什么 Ubuntu 软件有这么多依赖项(.deb)文件而 Windows 和 Mac 没有?

为什么 Ubuntu 软件有这么多依赖项(.deb)文件而 Windows 和 Mac 没有?

我有 Ubuntu 13.04,我想问为什么 Ubuntu 中的软件安装文件有这么多依赖项而 Windows 和 Mac 没有。

我的意思是,当我下载软件的 .deb 文件并将其带到我的离线机器时,软件中心说缺少包 x 或 y。

答案1

你正在看共享库工作 - 在这种情况下是依赖项。.deb文件不是为了可移植和仅可自行安装。

这些组件被分成单独的包,而不是包含单个应用程序所需的所有内容。如果另一个应用程序可以重用它们,那么它就可以简单地依赖它,而不必在系统上拥有多个副本。它也是一种经过更好测试的软件,更容易修补如果图书馆里有东西坏了。下面我将进一步解释这些优点。

  • 假设 JPEG 库libjpeg8包含一个严重的错误,并且假设您正在运行 12 个使用该库显示 JPEG 图像的应用程序。那么如果推出错误修复,则无需修补任何应用程序,只需修补软件包libjpeg8(它真的很小)。这为应用程序开发人员以及安装更新的个人最终用户节省了大量工作。这增强了安全性。

  • 它还有助于减少应用程序包的大小。假设您要安装一个图像查看器,并且您已经安装了大多数图像格式库,那么它将显著减少包的大小。您的包管理将看到,在应用程序正常运行之前,只需要安装您缺少的几个库。这会减少磁盘空间。

  • 也可以有可选功能。假设您正在开发一个应用程序,并且想要包含一个功能,但不是每个人都需要它。那么您可以简单地添加一个“推荐”依赖项,这样该功能只有在安装了该依赖项后才会起作用,但不感兴趣的用户不必安装它。如果依赖项真的很大,这尤其有用。这是大多数元包的工作方式,例如,texlive-full一个完整的 TexLive 安装(1.5GB!),包含所有推荐的字体,但您也可以安装texlive-base仅具有基本功能(~100MB)。这会减少磁盘空间(如果选择的话)。

  • 然后是原则单一职责在软件开发中。软件包具有非常明确定义的功能集,它将提供并很好地完成这些功能。与包含需要全面检查代码的大型应用程序相比,软件的测试将更好、更高效。此外,开发人员并不总是需要重新发明轮子。JPEG 库已经存在?那么为什么不重用它呢?可重用性提高开发速度和整体软件质量。

  • 另一个原因是内存占用。如果某个应用程序已将某个库加载到内存中,而另一个应用程序也想使用它,则无需再次将其加载到内存中。因此,您的图像查看器和 Web 浏览器将只共享已加载的 libjpeg8 库。这减少了加载时间和内存


Windows 应用程序通常非常易于移植。大多数库都静态内置在安装程序中,这就是典型的 Windows 安装如此之大的原因。此外,必须单独为应用程序推出补丁,这就是为什么您会看到如此多单独的更新程序(例如“Adobe Updater”、“HP updater”、“Java updater”等)的原因之一。显然,这样做的效率低得多。

答案2

程序通常会使用一些相同的文件。与其将这些文件放入每个包中,不如安装一个单独的包来为所有需要它们的程序提供这些文件。因此,要安装需要其中一个文件的程序,还必须安装包含这些文件的包。当一个包以这种方式依赖于另一个包时,这被称为包依赖关系。通过指定依赖关系,可以使包更小更简单,并且大多数文件和程序的重复项都会被删除。

当您安装程序时,必须同时安装其依赖项。通常,大多数必需的依赖项都已安装,但可能还需要一些额外的依赖项。因此,当您安装软件包时,如果还安装了其他几个软件包,请不要感到惊讶 - 这些只是您选择的软件包正常运行所需的依赖项。

优点是您不会意外下载相同依赖项的多个副本,而 Windows 经常会出现这种情况。安装程序通常会携带所需依赖项的副本,并将它们安装在单独的位置。当系统在 2 个位置找到相同的东西(或更糟的是不同版本的相同东西)时,这将导致路径出现问题。

来源:Ubuntu 帮助

相关内容