当我第一次转向 Linux 时,我喜欢的事情之一就是它的包管理。有一些项目将 Linux 风格的包管理引入了 Mac (Homebrew) 和 Windows (Chocolatey)。
我越来越多地看到为 Linux 提供 Snap 安装说明的应用程序,但添加第二个包管理系统的目的是什么?新的应用程序最终会迁移到 Apt(或其他 Linux 包管理系统),还是 Linux 用户必须在同一系统上运行两个不同的包管理器才能获得他们想要的所有应用程序?
答案1
Linux 上的传统包管理有很多优点。依赖关系可以共享,这使得事情变得小而高效。他们通常会经过某种委员会,因此需要经过多轮审查(这在 Linux 发行版之间有所不同,有些发行版的流程比其他发行版少)。通常也有一个记录错误的中心位置。
然而,传统的包管理有一些缺点。
例如,当您发布 libfoo 的新版本时,实际上使用该发行版的每个人都会获得该新版本。这意味着发行版维护者在发布更新时必须非常保守。他们不能倒退。
此外,很少看到应用程序的上游开发人员为各种 Linux 发行版打包其应用程序。尤其是当他们意识到他们将无法像预期那样轻松地发布更新时。例如,在 Ubuntu 上,一旦稳定版本被削减,通常不允许将新功能添加到发行版中的软件中。仅安全修复和错误修复。和即使这个过程很繁重。这就是 Ubuntu 保持稳定的方式,但这也是 Ubuntu 存档在发行版的生命周期中变得陈旧的方式。
另一个问题(这是一个缺点还是一个优点,取决于你如何看待它):通常为了将软件引入 Linux 发行版,它必须是开源的。并非一切都是如此。
快照在几个方面有所不同。首先,它们的依赖项被捆绑到同一个包中。这意味着它们无法共享,因此它们不如传统包那么高效,但这样做的原因是为了解决我刚刚提供的 libfoo 示例:它使 snap 开发人员可以自由地更改他们认为合适的内容不会破坏不相关的软件。因此,它们可以完全脱离 Linux 发行版进行分发,无需任何委员会参与。事实上,应用程序的上游开发人员为他们的应用程序创建和维护快照是很常见的,因为他们知道他们可以随时向用户发送更新,如果他们破坏了某些东西,他们只会破坏他们的用户,没有一半的发行版有 libfoo 损坏。
快照也只是包含......内容的squashfs图像。没有许可限制。这使得微软可以快速发布 Skype,或者 Spotify 可以发布他们的播放器。
由于它们捆绑了依赖项并且只是一个 squashfs 映像,因此在任何 Linux 发行版上安装和运行它们都变得非常容易,无论该发行版的内置包管理系统如何。
新的应用程序最终会迁移到 Apt(或其他 Linux 包管理系统),还是 Linux 用户必须运行两个不同的包管理器才能获得他们想要的所有应用程序?
是的,传统的依赖管理系统不会消失。随着时间的推移,新软件将通过 apt 提供。但这将继续由只想让软件适合的社区成员来完成,而不是由上游开发人员自己完成。根据您的 Linux 发行版的工作方式,该软件可能会随着时间的推移而变得陈旧,直到您升级到下一个发行版。一般来说,如果你想要最新的东西,你需要从上游开发者那里获取。正如您所注意到的,他们似乎越来越多地选择按扣来做到这一点。 PPA(或类似的)是另一种选择。
不管怎样,这并不是一个完整的优缺点列表,我们还有很多东西可以在这里讨论。我只是想指出,每种使用软件的方式都有其目的,而且都不会消失。
答案2
这个答案非常有偏见并且包含观点 - 我是一些 Linux 发行版的打包者。
正如莱纳斯·托瓦兹所说,Linux 的一个缺点是您不能“为 Linux”编译软件包(或应用程序);对于 Debian/Ubuntu/Fedora/Suse/RHEL/Arch/Manjaro 等,您可以这样做。
snap、flatpak 和 AppImage 等项目是用于打包应用程序的格式,以便它们应该适用于任何 Linux 发行版。这主要是通过包含运行时环境或静态编译来完成的。
像 Chromium 这样的大型软件包通常会看到这些格式的更多好处,因为它们非常难以编译。