- Snap 允许您将应用程序及其所有依赖项打包到隔离的容器中,从而使其易于在多个发行版中使用。 Linux.
- Snapcraft 是使用 snapcraft.yaml 配置文件来描述、构建和发布 Snap 软件包的官方工具。
- 严格的限制和插件接口控制每个 Snap 的安全性和权限,从而平衡隔离性和功能性。
- 发布到 Snap Store 可以简化 Nextcloud 或 Electron 项目等应用程序的分发和自动更新。
如果你在Linux系统下开发应用程序,迟早会遇到同样的难题: 如何以简单、安全且可更新的方式打包和分发您的软件 无需处理各个发行版之间的依赖关系。这就是 Snap 的用武之地,它是 Canonical 公司开发的软件包格式,已被越来越多的桌面和服务器环境所采用。
在本指南中您将看到 如何一步步创建 Snap 包,在电脑上测试,甚至发布到 Snap Store我们还会详细解释 Snap 是什么,snapd 扮演什么角色,它的优缺点,以及它最适合在什么情况下使用(例如,像 Nextcloud 或 Electron 项目这样的应用)。我们的目标是让您读完本文后,能够安全地打包自己的应用,并了解这种格式是否适合您。
Snap是什么?它为什么如此受欢迎?
Snap 是一种适用于 Linux 的通用软件包格式。由 Canonical(Ubuntu 背后的公司)创建的 Snap 软件包理念非常明确:确保同一个软件包在不同的发行版上都能完全一致地运行,而无需对基础系统进行任何修改。为了实现这一目标,每个 Snap 软件包都将应用程序及其几乎所有依赖项打包在一个独立的容器中。
与传统软件包依赖系统库不同 (deb、rpm 等)Snap 包自带所有必需组件,这能立即减少许多常见问题:库版本不兼容、依赖项损坏或与其他已安装软件包冲突。
整个系统由……管理 snapd,负责安装、更新和运行 Snap 的守护进程snapd 在后台运行,控制权限,强制执行安全沙箱,安排自动更新,并使您的系统保持最新状态,而您只需付出极少的努力。
得益于这种方法,无需进行任何更改即可安装同一个 Snap 包。 Ubuntu、Debian、Fedora、Arch Linux、Linux Mint 以及许多其他支持 snapd 的发行版。从开发者的角度来看,这是一种通过单一发行版格式触达更多用户的便捷方式。
与其他格式相比,Snap 的优势和劣势
在深入探讨实际操作方面之前,有必要先澄清一点: Snap有哪些优势和劣势? 与传统包装或 Flatpak 或 AppImage 等替代方案相比。
Snap最大的优势在于其分销独立性。一个制作精良的软件包可以在不同版本的 Ubuntu、Debian 或 Fedora 系统上正常运行,无需维护特定的分支。这简化了开发者和用户的工作流程,他们不再需要依赖各个发行版的软件仓库来获取最新的软件。
另一个关键优势是 每个 Snap 都在隔离的环境(沙箱)中运行。这种隔离可以降低安全漏洞的影响,防止应用程序访问不应该访问的系统文件,并限制与其他应用程序的冲突。 应用通过接口和 “插头” 您可以按照最小权限原则,逐步授予对网络、音频、摄像头、主目录等的受控访问权限。
另外, snapd 处理自动更新Snap 应用会在后台刷新,如果出现问题,您可以…… 回滚到之前的版本 只需一个简单的命令即可安装该软件包。这在生产环境或团队中能带来极大的安心感,无需持续监控每一次更新。
不太令人愉快的是,由于包含了几乎所有依赖项, Snap 文件通常会占用更多磁盘空间 相比传统格式的同类产品,这种格式也更加灵活。此外,一些打包应用程序(例如 Snap)也通常会提供多种格式。 启动需要更长时间。尤其是重型桌面式,因为其绝缘层和组装环境的原因。
社区部分成员争论的另一个焦点是: Snap Store 由 Canonical 集中管理。虽然格式是开放的,但主存储库由一家公司管理,这与 Linux 的分布式理念相冲突,也与 Flatpak 生态系统 (Flathub) 或 AppImage 的无存储方法形成对比。
在主流Linux发行版上安装并激活Snap
要创建和使用 Snap 软件包,您需要具备以下条件: snapd 已正确安装并正常运行 在你的系统上。具体过程会因发行版而略有不同,但总体来说都很简单。
En Ubuntu 及其现代衍生版本(16.04 及更高版本) snapd 已预装。您可以使用以下命令进行检查:
snap version
如果由于某种原因它不在那里,你可以运行以下命令使用 APT 安装它: 更新,然后安装 snapd:
sudo apt update
sudo apt install snapd
En Debian 或 Linux Mint 您可能会发现某个首选项文件阻止了 Snap 软件包的安装。在这种情况下,第一步是…… 取消禁止他们的规则:
sudo rm /etc/apt/preferences.d/nosnap.pref
然后,您可以按照相同的方式更新和安装 snapd:
sudo apt update
sudo apt install snapd
在世界 FedoraSnap 支持并非开箱即用,但您可以轻松启用它。首先,您需要安装 snapd,通常可以从标准软件源或 EPEL 软件源安装,具体取决于版本,然后…… 您启用套接字以便服务 引导:
sudo dnf install snapd
sudo systemctl enable --now snapd.socket
此外,为了实现经典路由兼容性, 符号链接/快照 指向 snapd 使用的目录:
sudo ln -s /var/lib/snapd/snap /snap
En Arch Linuxsnapd 已在官方软件仓库中提供。您可以使用 pacman 安装它,然后通过 socket 激活该服务:
sudo pacman -S snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
一旦你启动并运行起来,你就可以 安装、列出、更新和删除 Snap 与 comandos 基本的: snap install, snap list, snap refresh, snap remove y snap find 在 Snap Store 中搜索可用的应用程序。(参见) 如何列出Ubuntu上已安装的软件包)
如何在 Snap 中逐步打包应用程序
让我们进入大家通常最感兴趣的部分: 将您的应用程序打包成 Snap 格式一般流程是:准备您的应用程序,安装 Snapcraft,并定义一个文件。 snapcraft.yaml配置隔离环境,最后构建并测试软件包。
为了遵循这个过程,拥有以下工具会非常方便: 运行 Ubuntu 18.04 或更高版本的服务器或计算机 (或兼容的发行版),使用具有 sudo 权限的用户帐户,如果您想发布 Snap 应用,还需要在 Snapcraft 开发者控制面板上注册帐户。如果您还没有应用,可以使用一个简单的 Go 语言“Hello World”程序作为示例。
首先要创造 Snap 的特定工作目录 并将自己置于以下位置:
mkdir ~/tu-snap
cd ~/tu-snap
如果你的项目已经有了源代码,就把所有内容复制到那个目录下。如果是 Git 仓库,你可以初始化一个仓库,然后克隆或导入必要的文件。这样做的目的是…… 您的应用程序所需的一切都集中在一个文件夹中。因为这将是包装的起点。
如果你想要一个最小示例,你可以用 Go 语言创建一个小程序,并创建一个名为 `<filename>` 的文件。 helloworld.go 在屏幕上打印一条消息。如果尚未安装 Go,请使用 APT 安装 Go,然后运行 go run helloworld.go 在将基础应用程序转换为 Snap 之前,确保其运行正常。
应用准备就绪并放置在该目录中后,下一步将是…… 安装 Snapcraft 构建工具它负责读取配置、解决依赖关系并生成最终软件包。
安装并了解 Snapcraft,即用于创建 Snap 的工具。
Snapcraft 是 Canonical 官方面向开发者的工具包。 定义、构建和发布 Snap 包 无需重复造轮子。它以 Snap 格式安装,并在经典模式下运行,以便在编译期间获得必要的权限。
将其安装在 带有 snapd 的操作系统只需启动:
sudo snap install snapcraft --classic
选择 经典模式将严格封锁措施取消 对于 Snapcraft 来说,这是必要的,因为在打包过程中,它必须访问系统、启动构建、管理依赖项以及处理自身环境之外的文件。
安装完成后,您会看到一条消息,指示已添加到系统中的版本,类似于这样: “已安装 Canonical 的 snapcraft XXX”您可以通过运行以下命令来确认一切是否正确:
snapcraft --version
从这一刻起,命令 snapcraft 它在你的 shell 中可用,你可以在项目目录中使用它。 构建你的第一个 Snap 包但首先,必须使用特定的 YAML 文件定义其配置。
在 snapcraft.yaml 中定义名称、元数据、应用程序和部件
任何Snap的核心都是文件 snapcraft.yaml您可以在其中描述应用程序的功能、构建方式、向用户公开的命令、使用的插件、包含的部件以及所需的权限。
首先确保你仍然在…… 根目录 从你的项目(你创建的 Snap 文件夹)中,使用你喜欢的编辑器创建配置文件:
cd ~/tu-snap
nano snapcraft.yaml
首先,定义 基本元数据:名称、摘要、描述和版本例如:
name: helloworld
summary: Pequeña aplicación de ejemplo empaquetada como Snap.
description: |
Programa Hello World escrito en Go y distribuido como paquete Snap
usando la herramienta Snapcraft para ilustrar el proceso paso a paso.
version: '1.0'
名称必须是 只有当您打算在 Snap Store 上发布内容时才需要这样做。因此,最好先确认该名称是否已被占用。摘要有字数限制,描述可以使用多行符号(例如 `\n`)显示。 | 如示例所示。
接下来就轮到你作证了。 Snap 的“应用”也就是说,用户可以从以下位置执行的命令: 终端 要启动您的应用程序,请在文件中添加一个部分。 apps: 并至少定义一个条目:
apps:
helloworld:
command: helloworld
在这里, “helloworld”既是应用程序的逻辑名称,也是将要执行的命令。该命令必须与二进制文件相对应或 脚本 编译过程生成的文件;在 Go 示例中,它将是生成的可执行文件。
如果命令名称与 Snap 名称完全匹配,则可以在安装后直接运行。如果不匹配,Snap 会自动在软件包名称前添加一个前缀,在选择命名规则时需要注意这一点。
然后你必须定义 “各部分”这些是构成软件包的基本组成部分:主应用程序、辅助资源、附加依赖项等等。每个部分通常都包含一个 特定插件 这取决于你使用的语言或技术。例如,Go 语言有相应的插件。 Python Ruby、Rust、Node.js、Java 等。
抓住她 支持的插件列表 对于您的 Snapcraft 版本,您可以使用:
snapcraft list-plugins
例如, Go最简配置的部件可能如下:
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
选择 source: . 表明源代码位于同一目录中 文件所在位置 snapcraft.yaml以及参数 go-importpath 定义 Go 插件的导入路径。其他插件有各自的特殊选项,您可以参考相关文档。 snapcraft help nombre-del-plugin.
目前您可以保持文件打开状态,因为与[以下内容]相关的配置还需要添加。 安全限制和出入许可 您的申请需要用到这些。
限制、接口和插件:控制 Snap 权限
Snap 的一个显著特点是: 这些应用程序在测试环境或沙箱中运行。 这限制了他们的操作。此设置位于文件中。 snapcraft.yaml 使用密钥 confinement 必要时,可通过接口和插头进行连接。
首先,添加一个 限制线 提交:
confinement: strict
模式 严格级别是最高安全级别。 而且,如果您打算公开发布软件包,这通常是推荐的做法。在这种限制下,除非您通过特定接口允许,否则您的应用程序无法自由访问网络、主机的文件系统或其他资源。
界面就像 “权限连接器” 允许 Snap 访问特定资源:音频输入和输出、摄像头、网络、用户主目录、系统文件等。一些最常用的资源包括:
- 音频播放播放声音。
- 录音:从麦克风捕获音频。
- 相机:使用连接的网络摄像头。
- 主页:读取和写入主目录中的非隐藏文件。
- 网络:用于访问互联网和本地网络。
- 网络绑定以便该应用程序充当网络服务并监听端口。
- 系统文件:对主机文件系统拥有广泛的权限。
要将这些接口与您的 Snap 关联起来,您需要定义 带有描述性名称的插头 在 YAML 文件的相应部分中。一个简单的示例,提供对网络和主文件夹的访问权限:
plugs:
helloworld-home:
interface: home
helloworld-network:
interface: network
插头的名称(例如, helloworld-home这是用户在检查连接时会看到的内容,应该很清楚。稍后,Snap 安装完成后,您可以使用以下命令查看这些链接的显示效果。 snap connections nombre-del-snap这将显示每个插头连接的接口。
这样,你的文件 snapcraft.yaml 已包含 名称、元数据、应用程序、部件、限制和基本插头也就是说,首次构建软件包所需的最小结构。
Un 完整示例 “Hello World”程序可能如下所示:
name: helloworld
summary: Pequeño programa Hello World en Go empaquetado como Snap.
description: |
Aplicación de ejemplo que imprime "Hello, world!" en la terminal.
Empaquetada usando Snapcraft para mostrar el flujo de trabajo básico.
version: '1.0'
confinement: strict
apps:
helloworld:
command: helloworld
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
plugs:
helloworld-home:
interface: home
helloworld-network:
interface: network
构建、本地安装并测试您的 Snap 包
设置完成后,就该…… 编译 Snap 文件并在您自己的系统上进行测试。请确保您位于项目根目录下,然后运行:
snapcraft
Snapcraft 将启动一个 虚拟机或全新构建环境 (取决于您使用的版本和后端),它将下载必要的依赖项并生成软件包。如果一切顺利,您最终会看到类似这样的消息:
Snapped helloworld_1.0_amd64.snap
那个文件 helloworld_1.0_amd64.snap 是生成的软件包。它已准备好安装在兼容的系统上。要在本地进行测试,请使用以下命令(从同一目录或指定路径):
sudo snap install helloworld_1.0_amd64.snap --dangerous
选择 –dangerous 通知 snapd,他是一名没有官方签名的本地 Snap 用户因此,安装过程风险自负。安装完成后,您将看到类似“helloworld 1.0 已安装”的消息。
从那里,您可以 运行您在应用部分定义的命令, 在这种情况下:
helloworld
如果你的程序编写得当,它应该会显示文本。 “你好世界!” 在标准输出中,验证 Snap 是否正常工作。要检查活动权限和接口连接,可以使用:
snap connections helloworld
输出结果将列出每个接口、其关联的插头和对应的插槽,这对于以下用途非常有用: 一目了然地查看您的应用拥有哪些访问权限。 连接到网络、文件系统或其他资源。
在 Snap Store 发布您的 Snap,并按渠道进行管理。
当你的应用程序打包完善并经过测试后,合乎逻辑的下一步是…… 通过 Snap Store 将其提供给世界其他地区。要做到这一点,你需要一个 Snapcraft 开发者账号并使用该命令本身。 snapcraft 验证身份并上传文件。
首先登录您的开发者帐户 从终端:
snapcraft login
请输入您的电子邮件地址和密码 与您的帐户关联。验证成功后,下一步是: 在商店注册您的 Snap 用户名 这样它就能一直与你保持联系:
snapcraft register helloworld
如果该名称可用,操作将完成,您将能够…… 开始向 Snap Store 上传您的包裹评价吧! 使用命令 snapcraft push:
snapcraft push helloworld_1.0_amd64.snap
上传和自动审核过程之后您会看到类似如下的消息:
Revision 1 of 'helloworld' created.
每次发布同一软件包的新版本时, 修订号将会增加这对于识别特定版本并在必要时执行回滚非常实用。要使任何人都能安装 Snap,最后一步是将该版本发布到某个渠道。
snapcraft release helloworld 1 stable
您在这里表示应该发布。 “稳定”频道上的修订版 1您也有频道 候选、beta 和边缘 分发测试版本、候选版本或不稳定的开发版本(见 如何安装同一软件包的两个版本最后,您将看到一个频道和版本列表,其中显示了每个频道可用的版本。
从那时起,任何安装了 snapd 的用户都可以安装你的应用程序。 “sudo snap install helloworld” 当您在相关频道发布新评论时,即可收到自动更新。
对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。
