將 Linux 應用構建併發布到 Snap Store
在典型的開發週期中,您會在命令列中使用 flutter run 測試應用,或者使用 IDE 中的執行和除錯選項。預設情況下,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 專案的 <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 版本是從構建部分派生(採用)的。
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 在終端使用者系統上安裝後將擁有的系統資源訪問級別。嚴格的 confinement 將應用程式訪問限制在特定資源(在
app部分的 plugs 中定義)。 - Base
- Snaps 被設計為自包含的應用程式,因此它們需要自己的私有核心根檔案系統,稱為
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
一個或多個系統介面 plugs 的列表。在 snap 被嚴格限制時,需要這些介面來提供必要的功能。此 Flutter snap 需要訪問網路。
- DBus 介面
DBus 介面提供了一種 snap 透過 DBus 進行通訊的方式。提供 DBus 服務的 snap 宣告一個具有知名 DBus 名稱的 slot 以及它使用的匯流排。想要與提供 snap 的服務通訊的 snap 宣告一個提供 snap 的 plug。請注意,需要一個 snap 宣告才能透過 snap store 分發您的 snap 並宣告此知名 DBus 名稱(只需將 snap 上傳到 store 並請求手動稽核,稽核員將進行檢視)。
當安裝了提供 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_appParts
#此部分定義了組裝 snap 所需的源。
Parts 可以使用外掛自動下載和構建。與擴充套件類似,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 專案的 <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 VM 後端:
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 推送到 store:
snapcraft upload --release=<channel> <file>.snap
Snap Store 渠道
#Snap Store 使用渠道來區分不同版本的 snap。
snapcraft upload 命令將 snap 檔案上傳到 store。但是,在執行此命令之前,您需要了解不同的釋出渠道。每個渠道包含三個元件:
- Track
- 所有 snap 都必須有一個名為 latest 的預設 track。除非另有說明,否則這就是隱含的 track。
- Risk
- 定義應用程式的準備程度。Snap Store 中使用的風險級別為:
stable、candidate、beta和edge。 - Branch
- 允許建立短期 snap 序列來測試 bug 修復。
Snap Store 自動稽核
#Snap Store 會對您的 snap 執行幾項自動化檢查。根據 snap 的構建方式以及是否存在任何特定的安全問題,也可能需要進行手動稽核。如果檢查順利透過,snap 將在 store 中可用。
其他 snapcraft 資源
#您可以在 snapcraft.io 網站上的以下連結中瞭解更多資訊:
- Channels
- Environment variables
- Interface management
- Parts environment variables
- Releasing to the Snap Store
- Snapcraft extensions
- Supported plugins
其他部署資源
#一個一站式 Flutter 應用程式打包和分發工具,為您提供滿足各種分發需求的解決方案。
支援 appimage、deb、pacman、rpm 等流行的打包格式。
適用於 Flutter 應用離線構建的 Flatpak manifest 工具。
支援 Flatpak 在 Flathub 上釋出的準備工作。