Snapcraft 指南 (Linux)
本指南提供有关如何为任何 Snapcraft 环境(包括 Ubuntu 软件中心)打包 Electron 应用程序的信息。
背景和要求
Canonical 与更广泛的 Linux 社区携手,旨在通过 snapcraft
项目解决许多常见的软件安装问题。Snap 是包含所需依赖项、自动更新并在所有主要 Linux 发行版上都能运行而无需修改系统的容器化软件包。
有三种方法可以创建 .snap
文件
- 使用 Electron Forge 或
electron-builder
,这两个工具都自带snap
支持。这是最简单的选项。 - 使用
electron-installer-snap
,它接受@electron/packager
的输出。 - 使用已创建的
.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 文档。
const snap = require('electron-installer-snap')
snap(options)
.then(snapPath => console.log(`Created snap at ${snapPath}!`))
使用 snapcraft
和 @electron/packager
步骤 1:创建示例 Snapcraft 项目
创建您的项目目录并将以下内容添加到 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: electron-quick-start/electron-quick-start --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:
electron-quick-start:
plugin: nil
source: https://github.com/electron/electron-quick-start.git
override-build: |
npm install electron @electron/packager
npx electron-packager . --overwrite --platform=linux --output=release-build --prune=true
cp -rv ./electron-quick-start-linux-* $SNAPCRAFT_PART_INSTALL/electron-quick-start
build-snaps:
- node/14/stable
build-packages:
- unzip
stage-packages:
- libnss3
- libnspr4
如果要将此示例应用于现有项目
- 将
source: https://github.com/electron/electron-quick-start.git
替换为source: .
。 - 将所有
electron-quick-start
实例替换为您的项目名称。
步骤 2:构建 snap
$ snapcraft
<output snipped>
Snapped electron-packager-hello-world_0.1_amd64.snap
步骤 3:安装 snap
sudo snap install electron-packager-hello-world_0.1_amd64.snap --dangerous
步骤 4:运行 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
的部分并将其添加到应用程序的 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