构建并将 Linux 应用发布到 Snap Store
如何准备并将 Linux 应用发布到 Snap Store。
在典型的开发周期中,您可以通过命令行使用 flutter run 或者在 IDE 中使用 Run(运行)和 Debug(调试)选项来测试应用。默认情况下,Flutter 构建的是应用的调试版本。
当您准备好构建应用的发布版本(例如为了发布到 Snap Store 或其他渠道)时,本页面将为您提供帮助。
先决条件
#要构建并发布到 Snap Store,您需要以下组件:
设置构建环境
#请参考以下说明来设置您的构建环境。
安装 snapcraft
#在命令行中,运行以下命令:
sudo snap install snapcraft --classic
安装 LXD
#要安装 LXD,请使用以下命令:
sudo snap install lxd
Snap 构建过程中需要 LXD。安装完成后,需要对 LXD 进行配置。默认选项适用于大多数使用场景。
sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty disk or partition? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=5GB]:
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, "auto" or "none") [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, "auto" or "none") [default=auto]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
初次运行时,LXD 可能无法连接到其套接字。
An error occurred when trying to communicate with the 'LXD'
provider: cannot connect to the LXD socket
('/var/snap/lxd/common/lxd/unix.socket').
这意味着您需要将您的用户名添加到 LXD (lxd) 组中,因此请注销当前会话并重新登录。
sudo usermod -a -G lxd <your username>
Snapcraft 概述
#snapcraft 工具根据 snapcraft.yaml 文件中列出的指令构建 snap。要基本了解 snapcraft 及其核心概念,请查阅 Snap 文档 和 Snapcraft 简介。本页底部列出了更多链接和信息。
Flutter snapcraft.yaml 示例
#将 YAML 文件放在 Flutter 项目的 <项目根目录>/snap/snapcraft.yaml 下。(请记住,YAML 文件对空格非常敏感!)例如:
name: super-cool-app
version: 0.1.0
summary: Super Cool App
description: Super Cool App that does everything!
confinement: strict
base: core22
grade: stable
slots:
dbus-super-cool-app: # adjust accordingly to your app name
interface: dbus
bus: session
name: org.bar.super_cool_app # adjust accordingly to your app name and
apps:
super-cool-app:
command: super_cool_app
extensions: [gnome] # gnome includes the libraries required by flutter
plugs:
- network
slots:
- dbus-super-cool-app
parts:
super-cool-app:
source: .
plugin: flutter
flutter-target: lib/main.dart # The main entry-point file of the application
以下章节解释了 YAML 文件的各个部分。
元数据
#snapcraft.yaml 文件的这一部分定义并描述了应用程序。Snap 版本号是从构建部分派生(采用)的。
name: super-cool-app
version: 0.1.0
summary: Super Cool App
description: Super Cool App that does everything!
等级 (Grade)、限制 (Confinement) 和基础 (Base)
#此部分定义了 snap 的构建方式。
confinement: strict
base: core22
grade: stable
- 等级 (Grade)
-
指定 snap 的质量;这与后面的发布步骤有关。
- 限制 (Confinement)
-
指定 snap 安装在终端用户系统后将拥有何种级别的系统资源访问权限。严格限制 (Strict confinement) 会将应用程序的访问权限限制在特定资源内(由
app部分中的 plugs 定义)。 - 基础 (Base)
-
Snap 被设计为自包含的应用程序,因此它们需要自己独立的内核根文件系统,称为
base。base关键字指定了用于提供最小公共库集合的版本,并在运行时作为应用程序的根文件系统挂载。
应用程序 (Apps)
#此部分定义了 snap 内部存在的应用程序。每个 snap 可以有一个或多个应用程序。本示例包含单个应用程序——super_cool_app。
apps:
super-cool-app:
command: super_cool_app
extensions: [gnome]
- 命令 (Command)
-
指向相对于 snap 根目录的二进制文件,并在调用 snap 时运行。
- 扩展 (Extensions)
-
一个或多个扩展的列表。Snapcraft 扩展是可重用的组件,可以在构建和运行时向 snap 公开库和工具集,而无需开发人员具备所包含框架的具体知识。
gnome扩展将 GTK 3 库公开给 Flutter snap。这确保了更小的体积和与系统更好的集成。 - 插件 (Plugs)
-
系统接口的一个或多个插件列表。当 snap 被严格限制时,这些是提供必要功能所必需的。此 Flutter snap 需要访问网络。
- DBus 接口
-
DBus 接口 提供了一种 snap 通过 DBus 进行通信的方式。提供 DBus 服务的 snap 会声明一个具有知名 DBus 名称及其所用总线的 slot。想要与提供服务的 snap 通信的 snap 需要为该提供服务者声明一个 plug。请注意,要通过 Snap Store 分发并声明此知名 DBus 名称,需要进行 snap 声明(只需将 snap 上传到商店并请求人工审核,审核员会进行查看)。
当安装提供服务的 snap 时,snapd 将生成安全策略,允许其在指定的总线上监听该知名 DBus 名称。如果指定了系统总线,snapd 还将生成 DBus 总线策略,允许 'root' 拥有该名称,并允许任何用户与该服务通信。非 snap 进程可以在遵循传统权限检查的情况下与提供服务的 snap 通信。其他(消费型)snap 只能通过连接 snap 的接口与提供服务的 snap 通信。
dbus-super-cool-app: # adjust accordingly to your app name
interface: dbus
bus: session
name: dev.site.super_cool_app
部件 (Parts)
#此部分定义了组装 snap 所需的资源。
可以使用插件自动下载和构建部件。与扩展类似,snapcraft 可以使用各种插件(如 Python、C、Java 和 Ruby)来辅助构建过程。Snapcraft 还有一些特殊插件。
- nil 插件
-
不执行任何操作,实际构建过程使用手动覆盖来处理。
- flutter 插件
-
提供必要的 Flutter SDK 工具,这样您就不必手动下载和设置构建工具。
parts:
super-cool-app:
source: .
plugin: flutter
flutter-target: lib/main.dart # The main entry-point file of the application
桌面文件和图标
#桌面入口文件用于将应用程序添加到桌面菜单。这些文件指定了应用程序的名称和图标、所属类别、相关搜索关键字等。这些文件具有 .desktop 扩展名,并遵循 XDG Desktop Entry Specification 1.1 版本。
Flutter super-cool-app.desktop 示例
#将 .desktop 文件放在 Flutter 项目的 <项目根目录>/snap/gui/super-cool-app.desktop 下。
注意:图标和 .desktop 文件名必须与 yaml 文件中的应用名称相同!
例如
[Desktop Entry]
Name=Super Cool App
Comment=Super Cool App that does everything
Exec=super-cool-app
Icon=${SNAP}/meta/gui/super-cool-app.png # Replace name with your app name.
Terminal=false
Type=Application
Categories=Education; # Adjust accordingly your snap category.
将您的图标(.png 扩展名)放在 Flutter 项目的 <项目根目录>/snap/gui/super-cool-app.png 下。
构建 Snap
#snapcraft.yaml 文件完成后,在项目根目录下按如下方式运行 snapcraft。
使用 Multipass VM 后端:
snapcraft
使用 LXD 容器后端:
snapcraft --use-lxd
测试 Snap
#Snap 构建完成后,您将在项目根目录下获得一个 <名称>.snap 文件。
$ sudo snap install ./super-cool-app_0.1.0_amd64.snap --dangerous
发布
#现在您可以发布该 snap 了。该过程包含以下步骤:
- 在 snapcraft.io 创建一个开发者帐户(如果您还没有的话)。
- 注册应用名称。注册可以通过 Snap Store Web UI 门户完成,也可以通过命令行完成,如下所示:
snapcraft login snapcraft register - 发布应用。阅读下一节了解如何选择 Snap Store 通道后,将 snap 推送到商店。
snapcraft upload --release=<channel> <file>.snap
Snap Store 通道
#Snap Store 使用通道来区分不同版本的 snap。
snapcraft upload 命令会将 snap 文件上传到商店。但在运行此命令之前,您需要了解不同的发布通道。每个通道由三个部分组成:
- 轨道 (Track)
-
所有 snap 必须有一个名为 latest 的默认轨道。除非另有说明,否则这是默认轨道。
- 风险 (Risk)
-
定义应用程序的就绪程度。Snap Store 中使用的风险级别为:
stable(稳定)、candidate(候选)、beta(测试)和edge(前沿)。 - 分支 (Branch)
-
允许创建短期的 snap 序列来测试错误修复。
Snap Store 自动审查
#Snap Store 会对您的 snap 运行多项自动检查。根据 snap 的构建方式以及是否存在特定的安全问题,可能还会进行人工审核。如果检查顺利通过,snap 将在商店中可用。
更多 Snapcraft 资源
#您可以从 snapcraft.io 网站上的以下链接了解更多信息:
其他部署资源
#一款一体化的 Flutter 应用程序打包和分发工具,为您提供满足各种分发需求的一站式解决方案。
支持流行的打包格式,如 appimage、deb、pacman、rpm 等。
用于 Flutter 应用离线构建的 Flatpak 清单工具。
支持准备 Flatpak 以在 Flathub 上发布。