構建併發布 Linux 應用到 Snap Store
如何準備併發布 Linux 應用到 Snap store。
在典型的開發週期中,您可以在命令列使用 flutter run 或使用 IDE 中的 Run 和 Debug 選項來測試應用。預設情況下,Flutter 構建的是應用的 debug(除錯)版本。
當您準備好構建應用的 release(釋出)版本時,例如為了 釋出到 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 可能無法連線到其套接字 (socket):
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 專案的 <project root>/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 版本是從 build 部分派生(採用)的。
name: super-cool-app
version: 0.1.0
summary: Super Cool App
description: Super Cool App that does everything!
等級、限制和基礎映象
#此部分定義了 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擴充套件向 Flutter snap 暴露 GTK 3 庫。這確保了更小的佔用空間和更好的系統整合。 - 介面 (Plugs)
-
系統介面的一個或多個介面 (plugs) 列表。當 snap 受到嚴格限制時,需要這些介面來提供必要的功能。這個 Flutter snap 需要訪問網路。
- DBus 介面
-
DBus 介面 提供了一種讓 snap 透過 DBus 進行通訊的方式。提供 DBus 服務的 snap 宣告一個槽位 (slot),其中包含眾所周知的 DBus 名稱及其使用的匯流排。想要與提供服務的 snap 通訊的 snap 需宣告一個針對該提供方 snap 的介面 (plug)。請注意,需要提交 snap 宣告,以便您的 snap 能透過 snap store 分發並認領此眾所周知的 DBus 名稱(只需將 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 所需的源。
部件 (Parts) 可以使用外掛自動下載和構建。與擴充套件類似,snapcraft 可以使用各種外掛(如 Python、C、Java 和 Ruby)來輔助構建過程。Snapcraft 還有一些特殊的外掛。
- nil 外掛
-
不執行任何操作,實際的構建過程透過手動覆蓋 (manual override) 處理。
- 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 桌面條目規範 1.1 版。
Flutter super-cool-app.desktop 示例
#將 .desktop 檔案放在 Flutter 專案的 <project root>/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 專案的 <project root>/snap/gui/super-cool-app.png 下。
構建 snap
#snapcraft.yaml 檔案完成後,在專案的根目錄下執行 snapcraft,如下所示:
使用 Multipass 虛擬機器後端:
snapcraft
使用 LXD 容器後端:
snapcraft --use-lxd
測試 snap
#構建 snap 後,您的根專案目錄中將有一個 <name>.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 上釋出。