为什么会有snap-packages - 是否存在真正的需求?

假设

老实说,我对snap-packages并不了解太多 - 但这对于这个问题来说是无关紧要的 - 请看下文。我假设这个系统与现有系统有很大的不同。

这个改变有意义吗?

是否真的有足够强烈的需求?也就是说 - 是否有一个重要到足以开发新格式和相关基础设施的新用例?

难道不能通过改变当前方法来满足新的用例吗?

还是我误解了?

有可能我所看到的主要是市场营销 - 新的名称和呈现方式只是为了最小程度的技术变化,以便让任何人都认为它是“新的和更好的”,并且可能会被实际使用。另外,新的软件包可能是基于现有格式的变化较小的呈现方式。当然,这也可能是一个很好的解决方案。在这种情况下,这个问题可能没有太大的相关性。

那么,我希望它仍然足够有用以回答其他方面的问题。如果这个问题对新用户来说不太有帮助或者令人困惑,只需告诉我,我很乐意删除它。

那么,它们为什么存在呢?


背景

我的第一反应是“这毫无意义!”

这类似于一个情况,在物理学网站上,有人不满地问为什么没有人在回答中讨论他的新奇想法。这看起来像是一些离谱的想法;离实际物理知识如此之远,以至于很难找到一个切入点。我写了一个回答,没有触及他的想法,但解释了为什么不会讨论离谱的想法——这并不是第一次遇到这种情况。我认为这个回答其实抓住了要点。

如果我的假设是正确的,那么这个案例是类似的。

但也可能不是——让我们拭目以待。


1有一项接近的投票称为“主要基于观点” - 这是否意味着答案应该是基于观点的?这本身基本上就是一个答案,因为它意味着没有确立的共识认为需要进行改变。所以会有赞成和反对的论点;这意味着我的问题实际上非常切中要点,比我预期的更有用! - Volker Siegel
4我已经投票支持重新开放这个问题。它实际上是在询问为什么引入了Snaps,当已经存在软件包管理器并且Ubuntu(以及其他操作系统)已经拥有它们。所以你是对的:如果这实际上是一个主要基于观点的问题,那就意味着没有办法基于事实和经验给出答案。然而,正如你从muru的精彩回答中看到的,情况并非如此。关于何时(甚至是否)应该使用Snaps仍然是人们可以进行主要基于观点的讨论的问题,但这不是这个问题的本质。 - Eliah Kagan
2个回答

是的,确实有一个真正的需求。
自从第一次一个软件依赖于另一个软件以来,就一直存在着这样的需求。
让我们明确一下:
管理依赖关系是困难的。
之所以被称为“依赖地狱”,是有原因的。像RPM和Debian这样的打包系统的创建目的就是为了避免依赖地狱。然而,总有人必须承担代价:
在Windows上,程序会捆绑它们的依赖项,用户需要自己负责升级(以及由此带来的任何安全问题)。如果作为开发者,我想要我的应用程序使用某个软件的X版本,很简单:我将它与我的应用程序一起提供。那么如何处理更新呢?
在大多数Linux发行版(遵循Debian或Red Hat),一个程序可以依赖于存储库中的软件,而存储库中的程序必须依赖于存储库中的软件。如果我想要我的应用程序使用某个软件的X版本,并且发行版提供了X版本,很简单:我依赖于它。但是如果发行版没有提供呢?那么怎么办呢?
- 向发行版添加多个版本会增加维护者的负担 - 失去使用所需版本的依赖项的能力会增加开发者的负担 - 失去使用所需版本的应用程序的能力会让用户感到沮丧
无论哪种方法都会导致相当大的自由度损失。
这就是Snaps的用武之地:它们允许开发者包含所需的X版本,并让打包系统管理更新。谁来承担成本呢?用户。
  • 通过需要更多的空间。
  • 由于粗心的开发人员没有在依赖项修补时重新构建他们的快照,使它们面临风险。

我能得到什么好处作为交换?

  • 除了通过更新提供的安全性(坦白说,并不是足够多的人关心),作为用户,我不必担心快照的依赖关系。这个词基本上失去了意义。
  • 除了安全更新之外,软件开发人员不需要担心让用户安装正确的依赖项。

5是的,我认为“依赖地狱”这个词相当贴切地描述了它。 - Volker Siegel
1让我来提出相反的观点吧:),为什么他们不直接使用/opt呢? - user.dz
@Sneetsher这样考虑一下:是什么阻止了/opt目录中的一个应用程序覆盖另一个应用程序?更糟糕的是,如何防止一个应用程序读取另一个应用程序的私钥? - Evan
@Evan,嗯,AppArmor已经准备好来解决这个问题了。但是保护的方式可能会有所不同。无论如何,这个话题很重要。 - user.dz
muru,谢谢你写下这些内容。顺便说一下,这是关于为什么的谷歌上的第一个答案。不过我还是很好奇。我可以看到我的系统正在使用snaps来安装Chromium等应用。现在我想要安装Skype。通常我会使用sudo apt-get install skype命令,但是我发现它也可以通过snap来安装。然而,当我安装Chromium时,并没有采取任何特殊措施让它使用snap。但它确实使用了。所以现在我明白了为什么有snaps的存在,并且很高兴它们存在。现在我想知道是否需要担心使用sudo snap install skype命令? - SDsolar
@SDsolar 是的,Skype 有一个 snap 版本:https://snapcraft.io/skype 你可以同时安装 apt 和 snap 版本,但是 snap 版本很可能更新得更快、更新。 - muru
好的,明白了。非常感谢您为此做出如此详尽的解释。(一切都始于我在fdisk -l中看到的/dev/loopx条目)我现在将前往https://snapcraft.io/store并在那里获取Skype和Remmina。(我应该先卸载常规的Remmina吗?) 这里提供了非常优秀的参考问答。 - SDsolar
@SDsolar snaps的配置保存在~/snap目录中,与通过apt或其他方式安装的相同应用程序的配置分开,因此可以同时安装和运行两者。 - muru
好的,我可以在Unity中看到两者之间的差异。这很棒。 - SDsolar
只有当你不知道自己在做什么时,才会感觉像是地狱。如果你掌握了一些解决方案并能够阅读错误信息,其实并不难。 - mchid
用户似乎还要为更多的破损软件付费。我刚刚安装了Ubuntu 22.04,它带有snap版的Firefox,在其中核心功能(打开文件对话框!)是如此破损,以至于我立即卸载了snap版Firefox,安装了apt版的Firefox,一切都运行良好。现在我正在考虑彻底卸载snap。我很少更新软件,只在需要时才进行,并且非常偏爱稳定的系统。显然,Snap的质量保证存在严重问题。 - Bogatyr

Snaps的一个特点是可以选择开发者提供的多个渠道,比如“发布”、“候选”、“主要”等等,这可能会很有用。
例如,点击nextcloud渠道按钮将显示下面截图中的对话框。
另外,隔离性、不可变性和沙盒化也是其它强大的卖点,这些都由安全策略上下文控制,允许定义每个应用程序的权限,也称为“插件”,例如:
- 读/写位置 - 访问可移动存储 - 允许/禁止使用Snap的国家 - 网络访问 - 相机、打印机、游戏手柄、GPS定位 - 系统设置 - ...Snap接口的完整列表 这种方法在某种程度上模仿了MacOS应用程序包和Android的应用程序沙盒化,具有权限和内容提供者/接收者。

ubuntu snap packages select channel

现在,想象一下你需要运行十几个应用程序,每个应用程序都有自己的特定库版本,自己的Python/Ruby/NodeJS运行时版本,而且你不想陷入依赖地狱,也不想搞乱或污染系统库、系统Python/Node/Perl/Ruby模块等。
实际使用案例:
- 在树莓派4上,存储库中最新的PHP版本是7.3,如果你碰巧需要运行某些需要更高版本(例如更新版本的nextcloud)的东西,那么你将不得不找到一种绕过开箱即用的软件包管理器来实现,这可能会破坏其他软件包或导致不稳定。通过以snap方式运行nextcloud,无论你默认安装了什么依赖项,你都可以运行所需的版本。此外,snap还具有自动更新选项,这也很方便。
- 你需要同时运行不同版本的同一个Web服务器,例如apache2、nginx或caddy,因为你有多个应用程序,每个应用程序都需要特定的版本。