跳转至

Snapcraft 指南 (Linux)

本指南提供了如何将你的 Electron 应用打包到任何 Snapcraft 环境(包括 Ubuntu Software Center)的相关信息。

背景和要求

Canonical 与更广泛的 Linux 社区一起,旨在通过 snapcraft 项目解决常见的软件安装问题。Snap 是容器化的软件包,包含所需的依赖项,支持自动更新,并且无需修改系统即可在所有主流 Linux 发行版上运行。

有三种方法可以创建 .snap 文件:

1) 使用 Electron Forge 或 electron-builder,这两个工具都开箱即用地支持 snap。这是最简单的选择。 2) 使用 electron-installer-snap,它接受 @electron/packager 的输出。 3) 使用已经创建好的 .deb 包。

在某些情况下,你需要安装 snapcraft 工具。针对你特定发行版的 snapcraft 安装说明可在 此处 获取。

使用 electron-installer-snap

该模块的工作方式与 electron-winstaller 及类似模块相似,其范围仅限于构建 snap 包。你可以通过以下命令安装它:

npm install --save-dev electron-installer-snap

第 1 步:打包你的 Electron 应用

使用 @electron/packager(或类似工具)打包应用。请确保移除最终应用中不需要的 node_modules,因为任何实际不需要的模块都会增加应用的体积。

输出大致如下所示:

.
└── dist
    └── app-linux-x64
        ├── LICENSE
        ├── LICENSES.chromium.html
        ├── content_shell.pak
        ├── app
        ├── icudtl.dat
        ├── libgcrypt.so.11
        ├── libnode.so
        ├── locales
        ├── resources
        ├── v8_context_snapshot.bin
        └── version

第 2 步:运行 electron-installer-snap

在 PATH 中包含 snapcraft 的终端中,使用唯一的必需参数 --src 运行 electron-installer-snap,该参数指向你在第一步中创建的已打包 Electron 应用的位置。

npx electron-installer-snap --src=out/myappname-linux-x64

如果你已有构建流水线,可以通过编程方式使用 electron-installer-snap。更多信息,请参阅 Snapcraft API 文档。

```js @ts-nocheck const snap = require('electron-installer-snap')

snap(options) .then(snapPath => console.log(Created snap at ${snapPath}!))

## 将 `snapcraft` 与 `@electron/packager` 结合使用 {#using-snapcraft-with-electron-packager}

### 第 1 步:创建示例 Snapcraft 项目 {#step-1-create-sample-snapcraft-project}

```sh
$ npx create-electron-app@latest my-app

第 2 步:创建示例 Snapcraft 项目

在项目根目录下创建一个 snap 目录,并将以下内容添加到 snap/snapcraft.yaml:

name: electron-packager-hello-world
version: '0.1'
summary: Hello World Electron app
description: |
  Simple Hello World Electron app as an example
base: core22
confinement: strict
grade: stable

apps:
  electron-packager-hello-world:
    command: my-app/my-app --no-sandbox
    extensions: [gnome]
    plugs:
    - browser-support
    - network
    - network-bind
    environment:
      # Correct the TMPDIR path for Chromium Framework/Electron to ensure
      # libappindicator has readable resources.
      TMPDIR: $XDG_RUNTIME_DIR

parts:
  my-app:
    plugin: nil
    source: .
    override-build: |
        npm install electron @electron/packager
        npx electron-packager . --overwrite --platform=linux --output=release-build --prune=true
        cp -rv ./my-app-linux-* $SNAPCRAFT_PART_INSTALL/my-app
    build-snaps:
    - node/14/stable
    build-packages:
    - unzip
    stage-packages:
    - libnss3
    - libnspr4

如果你想将此示例应用于现有项目,请将所有的 my-app 替换为你的项目名称。

第 3 步:构建 snap

$ snapcraft

<output snipped>
Snapped electron-packager-hello-world_0.1_amd64.snap

第 4 步:安装 snap

sudo snap install electron-packager-hello-world_0.1_amd64.snap --dangerous

第 5 步:运行 snap

electron-packager-hello-world

使用现有的 Debian 包

Snapcraft 能够获取现有的 .deb 文件并将其转换为 .snap 文件。snap 的创建通过 snapcraft.yaml 文件进行配置,该文件描述了源、依赖项、描述以及其他核心构建模块。

第 1 步:创建 Debian 包

如果你还没有 .deb 包,使用 electron-installer-snap 可能是创建 snap 包的更简单途径。不过,创建 Debian 包的解决方案有很多,包括 Electron Forge、electron-builder 或 electron-installer-debian。

第 2 步:创建 snapcraft.yaml

有关可用配置选项的更多信息,请参阅 snapcraft 语法文档。让我们看一个示例:

name: myApp
version: '2.0.0'
summary: A little description for the app.
description: |
 You know what? This app is amazing! It does all the things
 for you. Some say it keeps you young, maybe even happy.

grade: stable
confinement: classic

parts:
  slack:
    plugin: dump
    source: my-deb.deb
    source-type: deb
    after:
      - desktop-gtk3
    stage-packages:
      - libasound2
      - libnotify4
      - libnspr4
      - libnss3
      - libpcre3
      - libpulse0
      - libxss1
      - libxtst6
  electron-launch:
    plugin: dump
    source: files/
    prepare: |
      chmod +x bin/electron-launch

apps:
  myApp:
    command: bin/electron-launch $SNAP/usr/lib/myApp/myApp
    desktop: usr/share/applications/myApp.desktop
    # Correct the TMPDIR path for Chromium Framework/Electron to ensure
    # libappindicator has readable resources.
    environment:
      TMPDIR: $XDG_RUNTIME_DIR

如你所见,snapcraft.yaml 指示系统启动一个名为 electron-launch 的文件。在此示例中,它会向应用程序的二进制文件传递信息:

#!/bin/sh

exec "$@" --executed-from="$(pwd)" --pid=$$ > /dev/null 2>&1 &

或者,如果你使用 strict 约束构建 snap,可以使用 desktop-launch 命令:

apps:
  myApp:
    # Correct the TMPDIR path for Chromium Framework/Electron to ensure
    # libappindicator has readable resources.
    command: env TMPDIR=$XDG_RUNTIME_DIR PATH=/usr/local/bin:${PATH} ${SNAP}/bin/desktop-launch $SNAP/myApp/desktop
    desktop: usr/share/applications/desktop.desktop

可选:启用桌面捕获

捕获桌面在某些使用 Wayland 协议的 Linux 配置中需要 PipeWire 库。要将 PipeWire 与你的应用程序捆绑,请确保基础 snap 设置为 core22 或更高版本。接下来,创建一个名为 pipewire 的 part,并将其添加到应用程序的 after 部分:

  pipewire:
    plugin: nil
    build-packages: [libpipewire-0.3-dev]
    stage-packages: [pipewire]
    prime:
      - usr/lib/*/pipewire-*
      - usr/lib/*/spa-*
      - usr/lib/*/libpipewire*.so*
      - usr/share/pipewire

最后,为你的应用程序配置 PipeWire 环境:

    environment:
      SPA_PLUGIN_DIR: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/spa-0.2
      PIPEWIRE_CONFIG_NAME: $SNAP/usr/share/pipewire/pipewire.conf
      PIPEWIRE_MODULE_DIR: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/pipewire-0.3

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 el/electron