Saltar al contenido principal

Snapcraft Guide (Linux)

Esta guía provee información sobre cómo empacar you aplicación en Electron para cualquier ambiente en Snapcraft, incluyendo el Centro de Software de Ubuntu.

Antecedentes y Requerimientos

Juntos con las amplia comunidad de Linux, Canonical busca arreglar algunos de los problemas comúnes de instalación de software con snapcraft. Snaps son paquetes contenerizados de software que incluyen dependencias requeridas, auto-actualizaciones, y funcionan en las mayores distribuciones de Linux sin modificaciones del sistema.

Hay tres maneras de crear un archivo .snap:

1) Using Electron Forge or electron-builder, both tools that come with snap support out of the box. Esta es la opción más fácil. 2) Using electron-installer-snap, which takes @electron/packager's output. 3) Usando un paquete .deb ya creado.

En algunos casos, deberás tener instalada la herramienta Snapcraft. Instructions to install snapcraft for your particular distribution are available here.

Usando electron-installer-snap

The module works like electron-winstaller and similar modules in that its scope is limited to building snap packages. Puede instalarlo con:

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

Paso 1: Empaqueta tu aplicación Electron

Package the application using @electron/packager (or a similar tool). Asegúrese de eliminar los node_modules que no necesita en su aplicación final, ya que cualquier módulo que actualmente no necesite aumentará el tamaño de su aplicación.

La salida debería verse más o menos de esta forma:

.
└── 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

Paso 2: Ejecutando electron-installer-snap

Desde una terminal que tenga snapcraft en su PATH, ejecute electron-installer-snap solo con el parámetro requerido --src, el cual es la ubicación de su aplicación empaquetada Electron que se creo en el primer paso.

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

Si tiene un pipeline de construcción existente, puede usar electron-installer-snap programáticamente. For more information, see the Snapcraft API docs.

const snap = require('electron-installer-snap')

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

Using snapcraft with @electron/packager

Paso 1: Crear proyecto de Snapcraft de Ejemplo

Crea el directorio de tu proyecto y agrega lo siguiente al 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

Si quiere aplicar este ejemplo a un proyecto existente:

  • Reemplace source: https://github.com/electron/electron-quick-start.git con source: ..
  • Reemplace todas las instancias de electron-quick-start con el nombre de su proyecto.

Paso 2: Construye el snap

$ snapcraft

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

Paso 3: Instalar el snap

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

Paso 4: Ejecutar el snap

electron-packager-hello-world

Usando un paquete de Debian existente

Snapcraft es capaz de tomar un archivo .deb existente y convertirlo en un archivo .snap. La creación de un a snap es configurado usando un archivo snapcraft.yaml que describe las fuentes, dependencias, descripción y otros bloques de construcción.

Paso 1: Crear un paquete Debian

Si aún no tienes listo un paquete .deb, usando electron-installer-snap podría ser una forma más fácil para crear el paquete instantáneo. However, multiple solutions for creating Debian packages exist, including Electron Forge, electron-builder or electron-installer-debian.

Paso 2: Creando un snapcraft.yaml

For more information on the available configuration options, see the documentation on the snapcraft syntax. Veamos un ejemplo:

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 &

Alternativamente, si esta construyendo su snap con aislamiento strict, puede usar el comando 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

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:

  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

Finally, configure your application's environment for 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