Snapcraft ガイド (Linux)
このガイドは、Ubuntu Software Centerを含む、Snapcraft環境向けにあなたのElectronアプリケーションをパッケージする方法を提供します。
背景と必要条件
幅広いLinux コミュニティと共に、Canonicalは共通したソフトウェアインストールの問題を解決するために、snapcraft
プロジェクトを開始しました。 Snaps は、依存関係と自動アップデートに必要なソフトウェアパッケージを含めたパッケージであり、システムを修正することなく多くのメジャーなLinuxディストリビューションで動作します。
.snap
ファイルを作成する方法は3つあります。:
- Electron Forge または
electron-builder
を使うと、どちらのツールでもsnap
がすぐに使用できます。 これは最も簡単な選択肢です。 2)electron-installer-snap
の使用。これは@electron/packager
の出力を利用します。 3) 作成した.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
の実行
snapcraft
が環境変数 PATH
に含まれている状態で、ターミナルから electron-installer-snap
を実行します。その際に、--src
パラメーターで、この第一ステップで作成する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.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
既存のデビアンパッケージの使用
Snapcraft は既存の.deb
ファイルをもとに、.snap
ファイルに変換できます。 この場合snapcraft.yaml
を利用してsnapを作成します。このファイルは、ソース、依存関係、説明、コアのビルドブロックを記述します。
ステップ1: デビアンパッケージの作成
.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: |
あなたは知っていますか? このアプリはすごい。 あなたのために色々してくれます。 ある者はこれで若さが保てるといい、また幸せに慣れると言っています。
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
# Chromium Framework/Electron の TMPDIR パスを修正し、
# libappindicator が読み取れるリソースを確保します。
environment:
TMPDIR: $XDG_RUNTIME_DIR
ご覧の通り、snapcraft.yaml
は electron-launch
と呼ばれるファイルを起動するようにシステムに伝達しています。 この例では、以下のようにアプリのバイナリへ情報を渡します。
#!/bin/sh
exec "$@" --executed-from="$(pwd)" --pid=$$ > /dev/null 2>&1 &
代替として、snap
を strict
禁則でビルドした場合、以下のように desktop-launch
コマンドを使用できます。
apps:
myApp:
# TMPDIR パスを、Chromium Framework/Electron が
# libappindicator の読み取り可能リソースを確認するために埋めます
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
というパーツを作成し、アプリケーションの 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