メインコンテンツにスキップ

Snapcraftガイド(Linux)

このガイドでは、Ubuntuソフトウェアセンターを含む、あらゆるSnapcraft環境向けにElectronアプリケーションをパッケージする方法について説明します。

背景と要件

より広範なLinuxコミュニティと共に、Canonicalはsnapcraftプロジェクトで、一般的なソフトウェアインストールに関する多くの問題を解決することを目指しています。Snapsは、必要な依存関係を含み、自動更新を行い、システム変更なしに主要なLinuxディストリビューションすべてで動作するコンテナ化されたソフトウェアパッケージです。

.snapファイルを作成する方法は3つあります。

  1. Electron Forgeまたはelectron-builderを使用します。どちらのツールも、すぐに使用できるsnapサポートが付属しています。これが最も簡単なオプションです。
  2. electron-installer-snapを使用します。これは@electron/packagerの出力を使用します。
  3. 既に作成された.debパッケージを使用します。

場合によっては、snapcraftツールをインストールする必要があります。特定のディストリビューションにsnapcraftをインストールする手順については、こちらをご覧ください。

electron-installer-snapの使用

このモジュールは、snapパッケージの構築に範囲が限定されているという点で、electron-winstallerや同様のモジュールのように動作します。以下を使用してインストールできます。

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の実行

PATHsnapcraftがあるターミナルから、唯一の必須パラメータ--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}!`))

@electron/packagerでのsnapcraftの使用

ステップ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.gitsource: .に置き換えます。
  • 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パッケージを作成する簡単な方法かもしれません。ただし、Electron Forgeelectron-builder、またはelectron-installer-debianなど、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をアプリケーションにバンドルするには、ベーススナップが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