我是基于 Debian 的发行版的用户 - Debian、Ubuntu、Linux Mint。我知道最新版本的软件通常不在存储库中,因此我经常直接从源代码下载并安装它们。
但是,我注意到该软件很少让您知道更新。另外,我从未注意到它们中的任何一个实际上是自行更新,然后只是请求安装许可。
是因为程序员普遍认为 Linux 版本将通过包管理器更新吗?
答案1
实现这种类型的功能非常困难,无论是“打电话回家”方面(查看是否有更新)还是“就地更新”方面:
- 在用户系统上运行的软件需要知道如何检查是否有更新的版本可用(这意味着向您的应用程序添加网络代码,这很可能没有任何其他原因使用网络);
- 无论网络条件如何,软件都需要正常工作(显然,当它完全离线时;但当它发现自己部分连接时,它也不应该因奇怪的错误而失败);
- 您需要有某种方法来决定是否有较新的版本可用(当用户从源存储库构建时如何比较版本?);
- 您需要在某处拥有一台具有服务器端功能的服务器,您可能还需要开发该服务器;
- 您需要确保更新不会在服务器上或通过中间人攻击而受到损害(因此您需要使用 TLS 和/或某种强签名);
- 您需要以用户可用的形式提供更新;他们可能最初是从源代码构建的,但不能保证他们运行软件的系统具有从源代码重建更新版本所需的一切 - 因此您需要提供二进制文件(对于所有可能的目标平台?)。
(这不是详尽的列表。)
这些都是发行版已经处理的问题,因此让发行版来处理事情会更容易。此外,如善行难陀已经解释过,关心运行某个软件的最新版本的用户可能非常关心它,至少会关注公告邮件列表,因此他们会以这种方式收到通知。
另一个需要考虑的方面是,相当多的人不希望他们使用的软件以任何方式回拨电话。一些发行版会竭尽全力消除从他们分发的软件中执行此操作的代码,甚至是可用于跟踪其使用情况的软件的其他部分(例如从网络加载图像、字体或 CSS 的文档)。查看所有“隐私泄露”标签Debian 的林天例如。
所有这些都解释了为什么包含自身提供更新信息的必要机制的软件如此之少,而能够自我升级的软件则更少。
还有其他方法可以解决“问题”:使用 CI 系统的软件开发人员通常可以扩展该系统,以某种可使用形式(作为包)提供“夜间”构建;感兴趣的用户可以建立自己的构建系统,定期提取他们关心的软件的更新源(这在企业环境中相当常见);或者您可以设置 AUR 风格的包,这些包是从最新的源代码构建的。
答案2
除非软件本身有能力“打电话回家”来检查更新,就像某些浏览器之类的同步事物似乎能够做到,通常没有机制能够自动提醒用户/管理员有更新版本的软件可用。
您使用包管理器安装的包是由人类创建的,这些用户可能有兴趣使它们保持最新并在他们关心的操作系统上正常运行。
包装例如的人安西布尔, 或者GNU 核心工具, 或者亚什外壳, 或者CMake或针对特定 Unix 系统的数千个软件项目中的任何其他项目很可能(但不一定)订阅这些项目的相关邮件列表和/或拥有用于定期查看源代码存储库或源分发文件的特殊工具。当他们得知新版本时,他们将根据其 Unix 上的打包程序以相关方式下载、编译、测试、修补(等)并打包软件。这可能涉及上游(与软件开发人员)和下游(与软件用户)有关构建/打包过程中出现的不兼容性或其他问题的沟通。
然后,他们将根据所使用的 Unix 以及第三方软件包分发的工作方式,以某种方式注册、上传或提交软件包,以便像我和您这样的用户可以使用我们的软件包管理器来更新我们的系统。
例如,我关心的是GNU 斯托适用于 OpenBSD(我是该软件的“端口维护者”)。我时不时地在 GNU 网站上检查 Stow 的当前状态(它不经常更新),当我发现新版本时,我会安装它并确保它可以工作,并更新 OpenBSD 端口在我的私人机器上。然后,我通过电子邮件发送 OpenBSD 端口列表,其中包含该端口的补丁(端口在 OpenBSD 上作为一组 Makefile 分发)。然后,具有提交权限的人将确保我的补丁完全应用,并且在将其提交到 OpenBSD ports CVS 树之前端口看起来正确。
下次用户更新 CVS 树并重建端口,或下载最终出现的二进制端口时,他们的 GNU Stow 安装就会更新。但 GNU Stow 本身并不知道自己的新版本是否可用。这根本不是 GNU Stow 应该做的事情。它是一种用于在独立的目录层次结构中安装第三方软件的工具,它是严重奇怪如果它每次使用时都尝试“打电话回家”(就像ls
突然需要网络访问才能运行一样奇怪)。
在许多情况下,单独进行软件更新可能是不可取的,因为系统的许多组件需要一起测试。所需的基础设施也会使较小的软件包严重膨胀,并且缺乏专业知识或资源的个人不可能运行某种高可用性更新服务器来开发自动保持最新的软件。
答案3
过去,计算机由专业人员管理,他们会根据需要安装新软件。
随着时间的推移,不同的操作系统发展了两种不同的传统,以减轻手动保持软件最新的负担。
- 在 Linux 和大多数其他现代 Unix 变体上,操作系统附带一个包管理器。大多数软件都是通过此包管理器安装的,当有新版本可用时,包管理器会更新软件。
- Windows 直到最近才附带包管理器,因此 Windows 软件提供商养成了使用自己的代码来安装更新的习惯。
包管理器方法特别适合开源世界,因为开源软件由数千个独立开发并组装在一起的包组成。组装软件包时很多事情都可能出错,因此大多数 Linux 发行版都提供了一个一致的集合,称为发布。一些发行版具有“滚动版本”,其中唯一的一致性检查是软件编译。其他人则进行更多测试,每年只提供一两次新版本,甚至每几年一次。
Linux 方法相对于 Windows 方法的一个优点是它允许软件包相互协作。这在 Windows 方法中很困难,因为如果软件 A 和软件 B 想要一起做某事,他们必须监视其伙伴是否已安装、应对升级、卸载时注意不要留下碎片……这一点尤其重要为什么Windows软件必须捆绑它使用的所有库,这意味着如果在库中发现错误,那么所有使用该库的软件都需要更新。相比之下,在 Linux 上,只需要更新包含该库的包,无论有多少程序使用它。
由于操作系统提供了软件更新机制,Linux 软件的作者不需要重新发明轮子。
很少需要安装比您的发行版提供的更新版本的软件。一般来说,较新的软件的错误也不少。如果发现严重错误(尤其是安全错误),发行版确实会提供更新。某些软件的较新版本只有在该版本具有您需要的新功能时才有用。
如果您希望拥有最新版本的软件,即使您不需要它,那么您应该安装滚动发行版,例如 Debian stable 或 Arch Linux。具有一致版本的发行版(例如 Ubuntu、Mint 或 Debian stable)适合那些不想每周破坏系统的人。
答案4
其他答案都很好,但我想补充一些他们都没有突出解决的问题:安全问题。
安装软件(至少是在系统范围内安装)通常需要 root 访问权限。您信任您的发行版的包管理器和打包软件的人员能够正确使用此权限,但您不一定信任您安装的每个随机软件都能正确执行此操作。