当前位置: 首页 > 文档资料 > Electron 中文文档 >

Snapcraft 指南 (Ubuntu 软件中心 & 更多)

优质
小牛编辑
157浏览
2023-12-01

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

Snapcraft Guide (Ubuntu Software Center & More)

This guide provides information on how to package your Electron application for any Snapcraft environment, including the Ubuntu Software Center.

背景和要求

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

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

1) 使用 electron-forgeelectron-builder, 与 snap 支持的两个工具都不在该框中。 这是最简单的选择。 2) 使用 electron-installer-snap, 它采用 electron-packager 的输出。 3) 使用已经创建的 .deb 包。

在所有情况下, 都需要安装 snapcraft 工具。我们建议在 Ubuntu 16.04 (或当前的) 上建立。

snap install snapcraft --classic

虽然 可以 在使用自制程序的 macOS 上安装 snapcraft, 但它无法生成 snap 包, 并且集中于管理存储中的包。

Background and Requirements

Together with the broader Linux community, Canonical aims to fix many of the common software installation problems with the snapcraft project. Snaps are containerized software packages that include required dependencies, auto-update, and work on all major Linux distributions without system modification.

There are three ways to create a .snap file:

1) Using electron-forge or electron-builder, both tools that come with snap support out of the box. This is the easiest option. 2) Using electron-installer-snap, which takes electron-packager's output. 3) Using an already created .deb package.

In all cases, you will need to have the snapcraft tool installed. We recommend building on Ubuntu 16.04 (or the current LTS).

snap install snapcraft --classic

While it is possible to install snapcraft on macOS using Homebrew, it is not able to build snap packages and is focused on managing packages in the store.

使用 electron-installer-snap

该模块的工作原理与electron-winstaller类似 因为它的范围仅限于构建捕捉包。 你可以这样安装:

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

Using electron-installer-snap

The module works like electron-winstaller and similar modules in that its scope is limited to building snap packages. You can install it with:

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

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

打包应用程序使用 electron-packager (或类似工具)。 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.

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

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

Step 1: Package Your Electron Application

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.

The output should look roughly like this:

.
└── dist
    └── app-linux-x64  ├── LICENSE  ├── LICENSES.chromium.html  ├── content_shell.pak  ├── app  ├── icudtl.dat  ├── libgcrypt.so.11  ├── libnode.so  ├── locales  ├── natives_blob.bin  ├── resources  ├── v8_context_snapshot.bin  └── 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.

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.

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

Step 2: Running 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.

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.

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

使用一个现有的 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.

Using an Existing Debian Package

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.

Step 1: Create a Debian Package

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:

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

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:

#!/bin/sh
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:

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

Step 2: Create a snapcraft.yaml

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

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

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:

#!/bin/sh
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:

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