構建並將 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 上釋出。