Snap包如何处理共享依赖项?

snap包装格式终于通过允许每个软件包拥有自己的依赖项副本,从而使我们摆脱了依赖地狱的困扰。我对它是如何实现这一点的技术细节很感兴趣。它是如何处理以下情况的呢:
- 对于当前版本已经通过deb软件包安装的库的snaps依赖关系,它会忽略已安装的库吗? - 不同的snaps是否指定了相同版本的同一库?它是否会进行去重处理? - 针对那些可能被许多snaps使用的核心库的更新,它是如何处理的?OpenSSL就是一个巨大的痛点。
xdg-app有一个叫做“runtime”的东西: > xdg-app中的一个基本概念是运行时/应用程序分离。每个应用程序都依赖于一个运行时,该运行时提供应用程序所依赖的核心库。运行时通常由许多应用程序共享,但用户可以同时安装多个运行时。
在xdg-app中,似乎OpenSSL将成为运行时的一部分,因此对OpenSSL的更新应该会透明地影响所有使用相同运行时的xdg-apps。
3个回答

第一和第二种情况都以巧妙的方式处理。
其中一个有趣的功能是对Snap软件包内的内容进行去重支持。基于文件哈希,Snaps会自动去重共享的常见文件。这将在文件系统层面、Snap下载(服务器支持)以及链接器中映射库的去重方面实现。去重是一个庞大的工作项目,可能需要一段时间来完全实现,但这仍然是一个有趣的目标。
来源:http://www.phoronix.com/scan.php?page=news_item&px=Ubuntu-Snappy-Deduplication 至于第三种情况,他们有类似于你提到的运行时环境。
有三个层次构成了一个快速的机器:系统层由Canonical提供,框架层由供应商与Canonical合作扩展基础系统,并且一组快速应用程序由供应商直接提供。更新任何部分只需使用新版本的只读镜像。回滚到以前的版本同样简单。
来源:http://www.ubuntu.com/cloud/snappy 目前还没有关于框架的良好文档,主要是因为他们似乎还在探索框架的边界。以下是他们邮件列表中的一段摘录,可能有助于澄清事情。
我正在尝试使用框架来扩展Snappy基本系统,通过软件和服务来满足许多快照所需的功能,但由于更新问题和大小限制,这些功能不应包含在每个快照中。最好的例子就是openssl二进制文件。许多快照需要它来生成和验证密钥和证书。
我试图通过一个框架解决的另一个问题是访问系统范围的资源,尤其是端口。例如,一个Web服务器框架可以提供一种方式,让其他快照通过反向代理将它们的Web服务API和终端点注入到运行Web服务器的框架中。
在IRC上有人告诉我,我有点滥用了框架的概念,但这两个问题经常出现在我的桌面上。
来源:https://lists.ubuntu.com/archives/snappy-app-devel/2015-November/000442.html

1澄清一下,这些现在都不存在,对吧?这些只是计划,你可能在第一行想说“将会处理”而不是“正在处理”,是这样吗? - muru
从技术上讲,两者都存在。我知道至少已经有一个Docker框架,并且Ubuntu Core中已经包含了一些库的链接,安装的应用程序可以利用这些链接。但是我不知道它们的发展程度如何;我只是在解释解决方案的技术细节。 - krzyzowiec
3这些并不是巧妙处理的方式,只是所谓的聪明点子。例如,关于第一个方式的实际实施仍然没有官方文件,只有一篇指向一个已经失效链接的Phoronix文章。 - bviktor

我不认为Snaps会检查已安装的依赖关系。它只包括所有的依赖项和运行时环境(这也是为什么LibreOffice Snap的大小为287MB,而Flatpak大约为200MB)。
Snaps几乎包含了软件运行所需的一切。我不认为Snaps之间有任何共享。
然而,当一个Snap更新时,它只会下载新的依赖项,而不是整个Snap。

关于snap包处理共享依赖的方式,需要进一步澄清。

Snaps基本上包含了软件运行所需的一切。我认为snaps之间没有共享任何东西。

这个回答中的说法在某种程度上是正确的,然而除了核心snap以外,所有已安装的snap包都依赖于两个软件包,其中一个就是核心snap。
  1. snapd - 默认情况下在16.04及更高版本中安装

  2. core - (核心snap)在第一个安装的snap包被安装时会自动下载和安装

除了核心本身以外,所有的snap包都依赖于核心snap。如果核心snap出现问题,那么其他一些或全部的snap可能无法正常工作。解决核心snap问题有以下两种方式。
1. 更新核心快照。即使这样做没有效果,运行以下命令的结果将提供额外的信息,有助于解决问题。
sudo snap refresh core 2. 卸载核心快照和所有快照包,然后重新安装它们。
sudo snap remove core snap-package1 snap-package2 sudo snap install core snap-package1 snap-package2