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


15

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

我了解Ubuntu或更一般的Linux软件包的依赖性。但是我想知道,为什么这些存在。不可能建立具有所有依赖关系的单个文件吗?这种方法有什么问题?

请尝试详细说明原因。

Answers:


17

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

想象一下,五个不同的程序使用了一个依赖项。如果在该依赖项中发现了安全漏洞,则只需更新一个副本,而不是五个副本。

对于用户而言,不需要安装多个软件包都没关系-安装要安装的一个软件会自动安装其依赖项。


.deb和.exe打包之间的主要区别不是Ubuntu软件没有发布在单个文件中。主要区别在于包含软件包的软件存储库的整个概念,并且可以轻松地提供更新。

对于没有直接互联网连接的计算机,这有时可能会出现问题。有一些工具,例如APTonCD,可以帮助最小化这些困难。


2
有时与像我们这样的用户(如果没有适当的互联网访问权限)关系重大
Anwar

2
我讨厌此功能,因为我的网络很慢。共享下载的ubuntu软件非常困难,(建议不要备份apt-cache,因为我每天都这样做)
Tachyons

1
但是,实际上,您应该喜欢该功能!因为,您无需下载五次库,而只需下载一次。想象一下,您的Ubuntu安装上的每个程序都带有自己的GTK +或Qt安装!那些事真是巨大
Michael Wild

4

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

信不信由你,在Windows或Ubuntu中安装程序的唯一区别是它们提供给用户的信息量。Windows认为其用户很笨,并且不希望他们在运行exe文件时知道正在安装什么。在Linux中,您可以获得该信息。.对于某些用户来说,细节太多了,但是其他(大多数)人真的很欣赏。

希望有道理。


2
绝对正确。甚至其他发行版(不如Ubuntu发行版)也使用.rpms。关于.exe,.deb或其他任何东西,基本上是一个大的.tar,它可以将自己提取到不同的地方!在Windows上,转到“程序文件”并显示进度条,而在Linux上,它显示的更多内容。
WindowsEscapist 2012年

1
我认为关于exe文件就像是大tar文件的建议在简化方面已经走得太远了。tar文件不可执行。一个exe文件(自然)是。也就是说,使用deb文件(实际上 tar文件),是由程序包管理器来处理文件移动的实际过程,因此系统可以非常优雅地掌握一切。对于安装程序(例如Windows中的程序),安装程序本身就是在执行该程序。它可能会与某些系统组件进行通信,以使事情保持整洁,但前提是感觉很简单。
Dylan McCall

1
最好的总结方法是Windows具有InstallShield和NSIS之类的安装程序制造商。也有针对Linux的工具。MojoSetup是一种流行的。那是您有时下载程序的地方,它有一个可执行文件(通常以.sh或.run结尾),并且为您提供了一个向导。那些通常不与程序包管理器对话,它们的工作原理与Windows中的安装程序很像。在此注意事项上,Windows Installer(及其.msi文件)只是为了消除其末端的混乱;)
Dylan McCall

我认为Linux方式远胜于Windows方式。但是,是Windows的方式既简单又容易
安瓦尔

2
对应的Windows文件格式.deb.msi
伊莱亚·卡根

3

在Ubuntu上,大多数软件的确包含在一个文件中。这是一个*.debdebian软件包文件,可从软件包管理器下载,解压缩和安装。

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

因为自解压*.exe文件是接受的非常危险的主张。

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

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

更详细地:

安全

在Windows世界中,您必须信任该单个*.exe文件。如何真正确定它可以被信任?您什至不知道它安装了什么?您如何确定它不会在背后做其他事情?

在Ubuntu中,所有软件包都是经过数字签名的,因此,通过使用单独的软件包文件-软件包管理器(无论是muon,突触,智能还是什至是apt),您都可以在内容解压缩之前得到验证,更不用说安装了。当然,这假定您信任存储库。我宁愿信任Ubuntu存储库(单一权限),也不愿下载数百个通常不熟悉的不同资源。

粒度控制

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

*.exe文件安装时,还必须信任其“卸载”挂钩(并非所有*.exe文件都保证有一个)。在Ubuntu中,软件包管理器安装的属于标准软件包的所有文件都可以始终被卸载,因为这是软件包管理器的功能,而不是软件包本身。程序包管理器是一个独立的受信任的应用程序,它提供安装程序和卸载程序,程序包无法从您手中夺走卸载挂钩。当然,恶意软件包可以通过安装后的动作来偷偷摸摸,但这就是为什么我们拥有正式的存储库系统,并且由我们信任的人来维护它们。

透明度

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

就是说,规则总是有例外,但是对我来说,安全性和信任意味着我无法接受来自数百个不同来源的执行二进制文件,这些文件很难作为标准的方式在我的系统上安装来验证。


2

除了别人说的话,有时由于不是所有功能都与所有用户相关,因此将单个软件分成几个软件包。例如,如果一个程序的文档很多,那么通常将由一个单独的程序包提供。这使对这些可选功能不感兴趣的用户可以节省磁盘空间和带宽/下载时间。


0

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

Windows软件大多打包在一个文件中。这是否意味着他们没有任何依赖性?

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

答:他们以自己的传统方式处理此问题。假设他们的大多数用户是愚蠢的,他们只需将所有依赖项放在一个文件中,就可以得到更大的软件(1档)。
例如,请参阅为Microsoft发布的游戏。尽管用户可能已经更新了DirectX设置,但几乎每个游戏都包含DirectX设置。

这是我在Google上发现的有关为什么每个游戏都包含DirectX的内容。

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

单击此处查看全文。显然,他们在处理依赖性方面做得不好。

在大多数情况下,无论是否已经存在依赖项,他们都会(为了方便用户)提供它来简化操作。另请参阅多少主题软件包含.NET运行时组件。
我的经验中的另一个示例:下载并安装了MS软件之后。对此过程感到满意后,我单击了图标以打开软件,然后它告诉我“我需要运行Java”。通过Linux的程序包管理,这种情况在Linux世界中永远不会发生。(除非您尝试从存储库站点下载.deb文件,然后以MS方式双击安装)

Linux如何处理依赖性问题?

好吧,Linux或Ubuntu并没有掩盖一个事实,即您必须安装依赖项才能使用该软件(与Microsoft方式不同)。但是,当您安装这些组件时,依赖于同一组件的另一种软件将使用先前安装的已安装视点(与包含所有组件的MS软件不同)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.