我们为什么需要Snap, Flatpak 和 AppImage?
早些时候,想要为各种Linux发行版分发应用程序的开发人员在打包方面面临许多挑战。这是因为市场上有许多Linux发行版,并且都使用不同的包管理系统。
例如,Ubuntu和其他基于debian的发行版使用 .deb包扩展,而Fedora、CentOS、RHEL使用 .rpm包扩展。这也适用于命令行(CLI)包管理器。此外,基于debian的发行版使用APT,而基于rhel的发行版使用DNF。因此,这些包(dnf、rpm等)最好的名称应该是与发行版相关的包格式。因此,开发人员必须按照目标发行版——Application_One.deb, Application_One.rpm等等打包他们的应用程序。
为了使Linux系统的软件开发和打包的整个过程更加简单和快速,开发人员构建了与发行版无关的包格式。它们包括Snap、Flatpak和AppImage。因此,通过这些包格式分发的任何应用程序都可以在支持这些框架的任何Linux系统上运行。
因此,让我们深入研究每一种包格式。
snap
Snap是由Canonical开发和维护的一个包管理器,于2014年首次发布。Snap是基于debian的发行版(比如Ubuntu)最好的备选包管理器之一。除了作为一个包存储,它还支持一个命令行界面来安装包。例如,要使用snap安装Brave浏览器,请执行以下命令:
sudo snap install brave
它最初是为Ubuntu开发的,但已经很容易被其他Linux发行版采用,包括Arch、Linux Mint、CentOS、Gentoo和Fedora。这些发行版还包括对Snapcraft框架的支持。为了方便地维护包,Snap为所有Snap应用程序使用了一个中央包存储库。
Snap有一个在线应用商店(Snapcraft),用户可以在那里找到并安装应用程序。这对用户来说是一个相当大的优势,因为他们有一个大的库来搜索他们需要的任何软件包。Snapcraft也由canonical维护和控制。
此外,Snapcraft框架允许开发者开发他们的包,并将它们上传到Snap商店。你可以在Snapcraft页面的底部看到这些指导方针。-如何在30分钟内搞定一款应用。
Flatpak
Flatpak由红帽员工亚历山大·拉尔森(Alexander Larsson)开发,并于2015年正式发布。它是用C编程开发的,提供了在Linux发行版上安装应用程序的一种快速和直接的方法。
Flatpak的工作原理是将一个应用程序组合并编译成一个包。此前,Flatpak被称为xdg-app。这个特定的框架使用了在沙箱环境中运行应用程序而不需要根特权的概念。因此,一些flatpak应用程序不能访问和利用系统的全部资源。
Flatpak应用程序主要针对三种桌面环境——FreeDesktop、KDE和GNOME。不幸的是,Flatpak不支持任何后端工具,因为它只生成在Desktop环境中运行的应用程序。这是这个包管理器的一个主要缺点,因为它不支持服务器,除非您安装像GNOME这样的桌面环境(DE)。
与Snap类似,Flatpak有一个名为Flathub的在线商店,用户可以在那里找到并下载他们想要的应用程序。Flathub首次发布时,只允许开发者发布免费和开源的应用程序。然而,在更新了他们的条款和条件之后,开发人员现在甚至可以发布专有包。
AppImage
这个包格式是由Simon Peter开发的,并以Kik的名字首次发布到市场上。AppImage使用了与Java编程相同的概念——“编写一次,随处运行”或“一个应用程序,一个文件”。
AppImage包包含应用程序本身及其运行所需的所有依赖项。一旦你下载了文件,就说balena-etcher.AppImage,你不需要安装文件。只需为它分配正确的权限,使其可执行,然后运行它。例如,运行balena-etcher.AppImage文件,我将使用下面的命令:
sudo chmod +x balena-etcher.AppImage
./balena-etcher.AppImage
像Snap和Flatpak包格式一样,AppImage也有一个在线仓库来查找和下载AppImage包——AppImage网站。
要更新AppImage包,您需要在下载文件时查看提供的更新指南。您也可以使用AppImage Updater或下载新版本的应用程序。AppImage支持Arch Linux、Centos、Debian、Fedora、OpenSUSE、Red Hat Linux和Ubuntu。
比较: Snap vs. Flatpak vs. AppImage
我们已经了解了这些封装格式是什么以及我们为什么需要它们。现在让我们来比较一下这三个元素——Snap、Flatpak和AppImage。
Permission controls
大多数Linux应用程序需要访问系统中的不同资源,以提供最大的性能。幸运的是,这些包格式允许您设置这些权限,并决定应用程序访问什么和不应该访问什么。
Snap
Snap为用户提供了图形和命令行方法来分配权限。要以图形方式分配权限,请启动Ubuntu软件中心,寻找你想要管理的已安装应用程序。然后,单击remove按钮旁边的Permissions按钮。
在上图中,我们可以看到分配给Leafpad应用程序的当前权限。您可以通过单击每个权限旁边的切换按钮来决定是启用还是禁用。
或者,如果您是命令行人员,则使用snap connections参数来查看设置的权限。例如,要查看分配给Leafpad应用程序的权限,我们将使用下面的命令
snap connections leafpad
Interface Plug Slot Notes
avahi-observe leafpad:avahi-observe - -
content[gtk-2-engines] leafpad:gtk-2-engines gtk2-common-themes:gtk-2-engines -
content[gtk-2-themes] leafpad:gtk-2-themes gtk-common-themes:gtk-2-themes -
content[icon-themes] leafpad:icon-themes gtk-common-themes:icon-themes -
cups-control leafpad:cups-control - -
desktop leafpad:desktop :desktop -
desktop-legacy leafpad:desktop-legacy :desktop-legacy -
gsettings leafpad:gsettings :gsettings -
home leafpad:home :home -
mount-observe leafpad:mount-observe - -
network leafpad:network :network -
removable-media leafpad:removable-media - -
x11 leafpad:x11 :x11 -
要给我们的应用授予权限,我们只需要选择特定的权限并使用snap connect命令,如下所示:
snap connect leafpad:mount-observe
要删除权限,使用snap disconnect命令:
snap disconnect leafpad:mount-observe
Flatpak
Flatpak还提供了图形和命令行方法来为Flatpak应用程序分配权限。我们将使用GNOME软件作为图形化方法,单击特定包上的Permissions按钮。
要查看通过终端分配给Flatpak的权限,使用下面的命令:
flatpak info --show-permissions com.github.jeromerobert.pdfarranger
记住用你的Flatpak包的名字替换com.github.jeromerobert.pdfarranger。要获取系统上所有Flatpak包的列表,请执行以下命令:
flatpak list
AppImage
在写这篇文章的时候,AppImage还没有为用户提供分配和删除权限的方法。然而,开发人员已经暗示他们可能会在未来加入这个功能。
沙箱
沙箱是指应用程序运行在与主机完全隔离的环境中的情况。通过使用上面讨论的api和权限实现与主机资源的任何交互。
Snap在沙箱应用程序中使用修改过的AppArmor,而Flatpak则使用命名空间。AppImage包不是沙箱包,也不需要sudo (root)特权来运行。
应用可移植性
当我们谈到可移植性时,我们指的是你将应用程序从一个系统共享到另一个系统,甚至将文件上传到云端的难易程度。在这一点上唯一胜出的包管理器是AppImage。对于其他包格式,如Snap和Flatpak,你需要打包应用本身,并包括它所依赖的子依赖项。
不幸的是,整个打包过程并不容易,需要执行各种命令。
写在最后
我相信这篇文章已经让你很好地理解了我们今天拥有的与发行无关的包格式——Snap、Flatpak和AppImage。尽管每个Linux发行版都自带包管理器,例如Ubuntu),这些第三方包格式已经被证明是非常有效和可靠的。
因此,您可以访问更多可用于其他发行版的应用程序。此外,不熟悉Linux系统的用户可以使用这些包格式(特别是AppImage)轻松安装应用程序,而无需执行多个命令来安装所需的依赖项。