跳至主要內容

建置並將 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 可能無法連線到其 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 專案中 <專案根目錄>/snap/snapcraft.yaml 下。(請記住,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 版本是從建置章節衍生(採用)的。

yaml
name: super-cool-app
version: 0.1.0
summary: Super Cool App
description: Super Cool App that does everything!

等級、限制和基礎

#

此章節定義如何建置 snap。

yaml
confinement: strict
base: core18
grade: stable
等級
指定 snap 的品質;這與稍後的發佈步驟相關。
限制
指定 snap 在安裝到最終使用者系統後將具有的系統資源存取層級。嚴格限制會將應用程式的存取權限限制為特定資源(由 app 章節中的外掛程式定義)。
基礎
Snap 設計為獨立的應用程式,因此,它們需要自己的私有核心根檔案系統,稱為 basebase 關鍵字指定用來提供最少的一組通用程式庫的版本,並在執行階段掛載為應用程式的根檔案系統。

應用程式

#

此章節定義 snap 內存在的應用程式。每個 snap 可以有一個或多個應用程式。此範例有一個應用程式 — super_cool_app。

yaml
apps:
  super-cool-app:
    command: super_cool_app
    extensions: [gnome]
命令

指向二進位檔,相對於 snap 的根目錄,並在叫用 snap 時執行。

擴充功能

一個或多個擴充功能的清單。Snapcraft 擴充功能是可重複使用的元件,可以在建置和執行階段將一組程式庫和工具公開給 snap,而無需開發人員具備包含的架構的特定知識。gnome 擴充功能會將 GTK 3 程式庫公開給 Flutter snap。這可確保更小的佔用空間和更好的系統整合。

外掛程式

一個或多個系統介面外掛程式的清單。當 snap 受到嚴格限制時,需要這些介面來提供必要的功能。此 Flutter snap 需要存取網路。

DBus 介面

DBus 介面提供了一種讓 snap 可以透過 DBus 通訊的方法。提供 DBus 服務的 snap 會宣告一個具有知名 DBus 名稱及其使用的匯流排的插槽。想要與提供 snap 的服務通訊的 snap 會宣告一個提供 snap 的外掛程式。請注意,需要 snap 宣告才能透過 snap store 交付您的 snap 並宣告此知名的 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

組件

#

此章節定義組合 snap 所需的來源。

可以使用外掛程式自動下載和建置組件。與擴充功能類似,snapcraft 可以使用各種外掛程式(例如 Python、C、Java 和 Ruby)來協助建置過程。Snapcraft 也有一些特殊的外掛程式。

nil 外掛程式
不執行任何動作,實際的建置過程是使用手動覆寫來處理的。
flutter 外掛程式
提供必要的 Flutter SDK 工具,因此您可以使用它,而無需手動下載和設定建置工具。
yaml
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 專案中 <專案根目錄>/snap/gui/super-cool-app.desktop 下。

注意:圖示和 .desktop 檔案名稱必須與 yaml 檔案中的應用程式名稱相同!

例如

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。此過程包含以下步驟

  1. 如果您尚未這樣做,請在 snapcraft.io 建立開發人員帳戶。
  2. 註冊應用程式的名稱。可以使用 Snap Store Web UI 入口網站或從命令列完成註冊,如下所示
    snapcraft login
    snapcraft register
  3. 發行應用程式。閱讀下一節以了解如何選取 Snap Store 頻道後,將 snap 推送到商店
    snapcraft upload --release=<channel> <file>.snap

Snap Store 頻道

#

Snap Store 使用頻道來區分 snap 的不同版本。

snapcraft upload 命令會將 snap 檔案上傳到商店。但是,在您執行此命令之前,您需要了解不同的發行頻道。每個頻道由三個元件組成

追蹤
所有 snap 都必須具有名為 latest 的預設追蹤。除非另有指定,否則這是隱含的追蹤。
風險
定義應用程式的準備狀態。snap store 中使用的風險層級為:stablecandidatebetaedge
分支
允許建立短暫的 snap 序列來測試錯誤修復。

Snap Store 自動審查

#

Snap Store 會對您的 snap 執行幾項自動檢查。根據 snap 的建置方式,以及是否存在任何特定的安全性考量,也可能會進行人工審查。如果檢查通過且沒有錯誤,snap 就會在商店中提供。

其他資源

#

您可以從 snapcraft.io 網站上的以下連結了解更多資訊