为什么软件不打包成一个文件?

为什么软件不打包成一个文件?

我们看到大多数 Windows 软件都打包在一个可执行文件中。当我双击安装文件时,它会安装所有文件、二进制文件和库。

我了解 Ubuntu 或更普遍的 Linux 软件包的依赖关系。但我想知道,为什么存在这些依赖关系。难道不能构建一个包含所有依赖关系的文件吗?这种方法有什么问题?

请尽量详细地说明原因。

答案1

依赖项不包含在程序本身中的主要原因是为了可以轻松更新系统的组件。

假设一个依赖项被 5 个不同的程序使用,如果在该依赖项中发现安全漏洞,则只需更新一个副本,而不是 5 个副本。

对于用户来说,需要安装多个软件包并不重要——安装您想要的一个软件就会自动安装其依赖项。


.deb 和 .exe 打包的主要区别不在于 Ubuntu 软件不是以单个文件形式发布的。主要区别在于包含软件包的软件存储库的整体概念,以及可以轻松提供更新。

对于没有直接互联网连接的计算机来说,这有时会有问题。有以下工具:亚太地区,帮助最大限度地减少这些困难。

答案2

这并不完全正确。Ubuntu 软件通常包含在一个 .deb 文件中。.deb 文件非常简单(且不准确),是 Windows 的对应 .exe 文件。所有程序(包括 Windows 中的程序)都使用操作系统中其他文件(库)的依赖项。安装过程在不同的操作系统中或多或少是明确的。当您使用 Ubuntu 中的软件中心下载程序时,您只会下载系统中未安装的依赖项和实际程序文件。这可以防止系统因重复文件和重复功能而过载,从而导致冲突。

不管你信不信,在 Windows 和 Ubuntu 上安装程序的唯一区别在于它们向用户提供的信息量。Windows 认为用户很笨,不希望他们在运行 exe 文件时知道安装了什么。在 Linux 上,你可以获得这些信息……对于一些用户来说,这太详细了,但其他用户(大多数)真的很感激这一点。

希望这是有意义的。

答案3

在 Ubuntu 上,大多数软件都包含在一个文件中。它是一个*.debDebian 软件包文件,可从软件包管理器下载、解压和安装。

为什么 Ubuntu 不像大多数 Windows 软件那样从自解压可执行文件安装软件?

因为自解压*.exe文件是一个非常危险的提议。

自解压可执行文件和打包系统(如 debian/Ubuntu)之间最关键的区别是:

  • 安全
  • 透明度
  • 更精细的控制

更详细地:

安全

在 Windows 世界中,您必须信任该单个*.exe文件。如何才能真正确定它是值得信任的?您怎么知道它安装了什么东西?您怎么能确定它不会背着您做其他事情?

在 Ubuntu 中,所有软件包都经过数字签名,因此通过使用单独的软件包文件 - 软件包管理器(无论是 muon、synaptic、aptitude 还是直接 apt) - 您可以验证内容它甚至没有被解压,更不用说安装了。当然,这假设您信任存储库。我宁愿信任 Ubuntu 存储库(单一权威机构),而不是数百个通常不熟悉的不同下载源。

精细控制

使用*.exe文件,您基本上可以做一件事:执行它。在 Ubuntu 中,您可以通过包管理器方便地检查包的内容、描述、配置、单个文件、最新更改、错误修复等。决定是否安装。

当您从*.exe文件安装时,您还必须信任其“卸载”挂钩(并非所有*.exe文件都保证有该挂钩)。在 Ubuntu 中,所有属于由包管理器安装的标准包的文件始终都可以卸载,因为这是包管理器的功能,而不是包本身的功能。包管理器是一个独立的、受信任的应用程序,它同时提供安装程序和卸载程序,包不能从您那里夺走卸载挂钩。当然,恶意包可以通过安装后操作偷偷安装东西,但这就是我们拥有官方存储库系统和我们信任的维护人员的原因。

透明度

它更进一步。在 Ubuntu 上,我可以真正信任我的系统,因为我可以在多个层面验证软件。最终的层面是能够查看源代码。二进制包有相应的源包。我实际上可以查看源代码(例如:'apt-get 源 bash' 将为您提供 bash shell 的完整源代码)。在 *.exe 文件的世界中,通常只有二进制文件,谁知道它们在幕后实际上做什么?

话虽如此,规则总有例外,但对我来说,安全和信任意味着我不能接受执行来自数百个难以验证的不同来源的二进制文件作为在我的系统上安装组件的标准方式。

答案4

让我们尝试分享我对依赖关系的理解(是的,我知道 Ubuntu 或更普遍的 Linux 处理软件的方式的优点。我只是想以一种中心的方式汇集所有好的意见和理由,这样我就可以向我的一些朋友展示)

Windows 软件大多打包在单个文件中。这是否意味着它们没有任何依赖关系?

不,几乎所有软件都依赖于其他软件。(除非该软件是低级的并且可以直接与硬件对话,例如操作系统本身)微软的软件并不能摆脱依赖性。因此,重要的问题是:他们如何处理这个问题?

答案:他们以自己的传统方式处理这个问题。假设大多数用户都是笨蛋,他们只是将所有依赖项放在单个文件中,从而导致软件大小更大(1 个文件)。
例如,参见为 Microsoft 发布的游戏。几乎每个游戏都包含 DirectX 设置,尽管用户可能已经更新了它们的版本。

这是我在 Google 上找到的关于为什么每个游戏都包含 DirectX 的信息。

即使已经安装了较新版本的二进制文件,也无法使用该版本,即使您的 DirectX 安装是最新的,因为您运行的是较新版本的安装程序,但不能保证已安装所有以前的版本。更糟糕的是,如果安装了 x86 版本,则不能保证安装 x64 的相同版本,因此 64 位和 32 位游戏可能需要运行完全相同的安装程序版本,但在运行时针对不同的平台。

点击这里阅读全文。很明显他们在处理依赖性方面做得不是很好。

大多数情况下,无论依赖关系是否已经存在,它们都会提供它以获得简单性(对于其用户而言)。还要看看有多少软件本身包含 .NET 运行时组件。
另一个我的经验示例:我曾经下载并安装了 MS 软件。对这个过程感到满意,我点击图标打开软件,然后它才告诉我“我需要 Java 才能运行”。这种情况在 Linux 世界中永远不会通过其包管理发生。(除非您尝试从存储库站点下载 .deb 文件并以 MS 方式双击安装)

Linux 如何处理这个依赖性问题?

好吧,Linux 或 Ubuntu 并不隐瞒这样一个事实:您必须安装依赖项才能使用该软件(与 Microsoft 的方式不同)。但是当您安装组件时,依赖于同一组件的另一个软件将使用先前安装的依赖项(与包括所有内容的 MS 软件不同)。

相关内容