Snapcraft 指南 (Linux)

本指南提供了有关如何包装你的 Electron 应用程序的任何 Snapcraft 环境, 包括 Ubuntu 软件中心的信息。

背景和要求

与更广泛的 Linux 社区一起, 规范旨在解决 snapcraft 项目中的许多常见的软件安装问题。 Snaps 是容器化的软件包, 包括所需的依赖项、自动更新和对所有主要 Linux 发行版的工作, 而无需进行系统修改。

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

1) 使用 Electron Forgeelectron-builder,这两个工具都提供 snap 开箱即用支持 这是最简单的选择。 2) 使用 electron-installer-snap, 它采用 electron-packager 的输出。 3) 使用已经创建的 .deb 包。

在某些情况下,您需要安装 snapcraft 工具。 安装特定发行版的 snapcraft 的指南在这里能看到。

使用 electron-installer-snap

The module works like electron-winstaller and similar modules in that its scope is limited to building snap packages. 你可以这样安装:

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

步骤 1: 打包你的 Electron 应用程序

Package the application using electron-packager (or a similar tool). Make sure to remove node_modules that you don’t need in your final application, since any module you don’t actually need will increase your application’s size.

结构输出应该看起来大致像这样:

  1. .
  2. └── dist
  3. └── app-linux-x64
  4. ├── LICENSE
  5. ├── LICENSES.chromium.html
  6. ├── content_shell.pak
  7. ├── app
  8. ├── icudtl.dat
  9. ├── libgcrypt.so.11
  10. ├── libnode.so
  11. ├── locales
  12. ├── resources
  13. ├── v8_context_snapshot.bin
  14. └── version

步骤 2: 运行 electron-installer-snap

From a terminal that has snapcraft in its PATH, run electron-installer-snap with the only required parameter --src, which is the location of your packaged Electron application created in the first step.

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

If you have an existing build pipeline, you can use electron-installer-snap programmatically. For more information, see the Snapcraft API docs.

  1. const snap = require('electron-installer-snap')
  2. snap(options)
  3. .then(snapPath => console.log(`Created snap at ${snapPath}!`))

Using snapcraft with electron-packager

第 1 步:创建示例 Snapcraft 项目

创建你的项目目录并将以下内容添加到 snap/snapcraft.yaml

  1. name: electron-packager-hello-world
  2. version: '0.1'
  3. summary: Hello World Electron app
  4. description: |
  5. Simple Hello World Electron app as an example
  6. base: core22
  7. confinement: strict
  8. grade: stable
  9. apps:
  10. electron-packager-hello-world:
  11. command: electron-quick-start/electron-quick-start --no-sandbox
  12. extensions: [gnome]
  13. plugs:
  14. - browser-support
  15. - network
  16. - network-bind
  17. environment:
  18. # Correct the TMPDIR path for Chromium Framework/Electron to ensure
  19. # libappindicator has readable resources.
  20. TMPDIR: $XDG_RUNTIME_DIR
  21. parts:
  22. electron-quick-start:
  23. plugin: nil
  24. source: https://github.com/electron/electron-quick-start.git
  25. override-build: |
  26. npm install electron electron-packager
  27. npx electron-packager . --overwrite --platform=linux --output=release-build --prune=true
  28. cp -rv ./electron-quick-start-linux-* $SNAPCRAFT_PART_INSTALL/electron-quick-start
  29. build-snaps:
  30. - node/14/stable
  31. build-packages:
  32. - unzip
  33. stage-packages:
  34. - libnss3
  35. - libnspr4

如果要将此示例应用于现有项目:

  • 替代 source: https://github.com/electron/electron-quick-start.git</0 > 为 <code>source: ...
  • 替代所有的 electron-quick-start 为你的项目名称。

第 2 步:构建 snap

  1. $ snapcraft
  2. <output snipped>
  3. Snapped electron-packager-hello-world_0.1_amd64.snap

第 3 步:安装 snap

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

第 4 步:运行 snap

  1. electron-packager-hello-world

使用一个现有的 Debian 包

Snapcraft is capable of taking an existing .deb file and turning it into a .snap file. The creation of a snap is configured using a snapcraft.yaml file that describes the sources, dependencies, description, and other core building blocks.

步骤 1: 创建一个 Debian 包

If you do not already have a .deb package, using electron-installer-snap might be an easier path to create snap packages. However, multiple solutions for creating Debian packages exist, including Electron Forge, electron-builder or electron-installer-debian.

步骤 2: 创建一个 snapcraft.yaml

For more information on the available configuration options, see the documentation on the snapcraft syntax. Let’s look at an example:

  1. name: myApp
  2. version: '2.0.0'
  3. summary: A little description for the app.
  4. description: |
  5. You know what? This app is amazing! It does all the things
  6. for you. Some say it keeps you young, maybe even happy.
  7. grade: stable
  8. confinement: classic
  9. parts:
  10. slack:
  11. plugin: dump
  12. source: my-deb.deb
  13. source-type: deb
  14. after:
  15. - desktop-gtk3
  16. stage-packages:
  17. - libasound2
  18. - libnotify4
  19. - libnspr4
  20. - libnss3
  21. - libpcre3
  22. - libpulse0
  23. - libxss1
  24. - libxtst6
  25. electron-launch:
  26. plugin: dump
  27. source: files/
  28. prepare: |
  29. chmod +x bin/electron-launch
  30. apps:
  31. myApp:
  32. command: bin/electron-launch $SNAP/usr/lib/myApp/myApp
  33. desktop: usr/share/applications/myApp.desktop
  34. # Correct the TMPDIR path for Chromium Framework/Electron to ensure
  35. # libappindicator has readable resources.
  36. environment:
  37. TMPDIR: $XDG_RUNTIME_DIR

As you can see, the snapcraft.yaml instructs the system to launch a file called electron-launch. In this example, it passes information on to the app’s binary:

  1. #!/bin/sh
  2. exec "$@" --executed-from="$(pwd)" --pid=$$ > /dev/null 2>&1 &

Alternatively, if you’re building your snap with strict confinement, you can use the desktop-launch command:

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

Optional: Enabling desktop capture

Capturing the desktop requires PipeWire library in some Linux configurations that use the Wayland protocol. To bundle PipeWire with your application, ensure that the base snap is set to core22 or newer. Next, create a part called pipewire and add it to the after section of your application:

  1. pipewire:
  2. plugin: nil
  3. build-packages: [libpipewire-0.3-dev]
  4. stage-packages: [pipewire]
  5. prime:
  6. - usr/lib/*/pipewire-*
  7. - usr/lib/*/spa-*
  8. - usr/lib/*/libpipewire*.so*
  9. - usr/share/pipewire

Finally, configure your application’s environment for PipeWire:

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