第654回ではsnapパッケージの基本的な話を紹介しました。今回はGUIアプリケーションをsnapパッケージ化する際の手順について、
snapパッケージの際に気をつけるべきこと
snapパッケージを作る際は、
- GUIアプリケーションか、
CLIアプリケーションか - システムファイルにアクセスする必要があるかどうか
- サードパーティのカーネルモジュールが必要かどうか
- パッケージ化対象のパッケージフォーマットは何か
snapパッケージはGUIアプリケーションか、
GUIアプリケーションをsnapパッケージにする場合は、
2番目の/usr/
」/etc
」
3番目の
ここまではホストのリソースへのアクセスの話でしたが、
上記を自問自答した上で、
snapパッケージはあくまで
「Thorium Reader」をsnapパッケージ化するための検討
さて、
- GUIかCLIか:GUIアプリケーション
- システムファイルにアクセスする必要があるかどうか:不要
- サードパーティのカーネルモジュールが必要かどうか:不要
- パッケージフォーマットは何か:debもしくはnpm
2については、XDG_
~/snap/<パッケージ名>/<バージョン>/.config
)
4については、
それでは実際にパッケージ化を進めていきます。第654回でも説明したように、
$ sudo snap install snapcraft --classic $ sudo snap install multipass
ベースのYAMLファイルを作成する
snapパッケージはYAMLファイルによってそのメタデータを管理しています。ベースのYAMLファイルはsnapcraft
コマンドで生成可能です。
$ mkdir thorium-reader-snap && cd $_ $ snapcraft init
作られるのはsnap/
」
まずはパッケージ名を決めましょう。もちろん、
snapパッケージの名前は、snap find
」snap info パッケージ名
」
ちなみにsnapパッケージはソフトウェアの開発者がパッケージング・snap/
」
つまりあるソフトウェアのsnapパッケージを作る際は、ソフトウェア名-snap
」snap-ソフトウェア名
」ソフトウェア名-機能
」
今回は
name: thorium-reader-snap
base: core20
version: '0.1'
license: BSD-3-Clause
summary: EPUB reader based on the Readium Toolkit
description: |
Thorium Reader is an easy to use EPUB reading application for cross
platforms.
This is unofficial re-packing of the debian package provided by EDRLab.
grade: devel
confinement: devmode
parts:
my-part:
plugin: nil
name
以外だとversion
やgrade
以下はそのままで、summary
やdescription
はオフィシャルの紹介を参考に、license
も公式サイトや配布しているパッケージの情報を元に付けています。SPDXなフォーマットに合致するものがあればそれを使いましょう。未設定だとプロプライエタリ扱いになります。
ポイントはbase
をcore20
にしていることです。core20
しかしながらThorium Readerの公式サイトによると、
さらに、
$ git init $ git add -A $ git commit -am "Initial snapping"
試しにこのままビルドしてみましょう。
$ snapcraft --debug (中略) Pulling my-part + snapcraftctl pull Building my-part + snapcraftctl build Staging my-part + snapcraftctl stage Priming my-part + snapcraftctl prime Snapping | Snapped thorium-reader-snap_0.1_amd64.snap
さっそくパッケージが作られましたね。今はまだ何もしない空のパッケージです。ここから中身を追加していくとにします。
Debファイルをsnapパッケージに変換する
前項でパッケージの名前が決まり、
パッケージの構築に必要なpartsを記述する
Thorium ReaderはLinux向けのバイナリとしてdebパッケージを提供しています。今回はこのdebパッケージをそのまま流用することにします。修正するのはparts
の部分です。
parts:
thorium-reader:
source: https://github.com/edrlab/thorium-reader/releases/download/v1.6.0/EDRLab.ThoriumReader_1.6.0_amd64.deb
source-type: deb
plugin: dump
parts
はパッケージをビルドする際に必要なコンポーネントや手順を記述する領域です。ソースコードはどこにあるのか、part(s)
を記述します
上記の例だとthorium-reader
」parts
が記述されています。この名前は任意の文字列を指定可能です。今回はすでにバイナリ化されているパッケージをそのまま利用するため、parts
はひとつで十分です。たとえばthorium-readerをビルドするためには、parts
の中身が増えていくことになるでしょう。
さて、parts
の個々のコンポーネントには一般的にsource
」plugin
」source
はそのままデータのURLを書きます。ネットワーク上のデータだけでなく、source-type
でそのファイルをどう展開するかを記述します。たとえばsource
にGitリポジトリを、soruce-type
にsource-tag
でリリースタグを指定するような運用も可能です。
plugin
がそのデータをどう利用するかのテンプレートとなります。最初に設定されていたnil
」source
を展開後に手作業で必要なデータのみをsnapパッケージ内部にコピーしたい場合に利用します。どのプラグインでも扱いづらいパッケージを作る時に役に立つでしょう。
今回はdump
」source
を展開したデータがそのままsnapパッケージのツリーに取り込まれるプラグインです。他にも特定のディレクトリツリーをそのまま取り込みたい場合などに利用します。
プラグインに関してはsnapcraft help プラグイン名
」
まずはこの状態でビルドしてみましょう。
$ snapcraft --debug (中略) Pulling thorium-reader + snapcraftctl pull Downloading 'EDRLab.ThoriumReader_1.6.0_amd64.deb' Building thorium-reader + snapcraftctl build + cp --archive --link --no-dereference . /root/parts/thorium-reader/install Staging thorium-reader + snapcraftctl stage Priming thorium-reader + snapcraftctl prime This part is missing libraries that cannot be satisfied with any available stage-packages known to snapcraft: - libX11-xcb.so.1 - libX11.so.6 (中略) - libxcb.so.1 - libxkbcommon.so.0 These dependencies can be satisfied via additional parts or content sharing. Consider validating configured filesets if this dependency was built. Snapping | Snapped thorium-reader-snap_0.1_amd64.snap
ビルドログにいろいろな情報が出てくるようになりました。
pull
フェーズでsource
に指定したファイルをダウンロードしていますbuild
フェーズで展開したファイルをそのままコピーしていますstage
フェーズでは表面上は特に何もしていませんprime
フェーズでsnapパッケージのツリーを作る際にいくつか警告が出ています
最後の警告は実際にインストールされるバイナリを精査して、parts
のstage-packages
に記述すべきです。
しかしながらデスクトップアプリケーションに関しては、apps
」
ユーザーに見せる部分となるappsを記述する
parts
はapps
です。
サンプルパッケージの段階ではapps
は存在しませんでした。このため、/snap/
」
これでは不便ですし、
Thorium ReaderのようなGUIアプリケーションについては、
GUIアプリケーションを作るなら、
今回は次のような記述をsnap/
に追加します。
compression: lzo
apps:
thorium:
command: opt/Thorium/thorium
extensions: [gnome-3-38]
- snapパッケージの圧縮方法をxzからlzoに変更しました
- アプリケーション名として
「 thorium
」を使います opt/
をユーザーから見えるようにしましたThorium/ thorium - エクステンションとしてgnome-3-38を利用します
apps
を指定することで、/snap/
以下に作られます。Ubuntuだと環境変数PATH
に/snap/
が入っているので、command
に何かスクリプトを指定したり、command-chain
で複数のコマンドを指定することになります。
大事なのがextensions
です。何を指定するかはgnome-3-34
を指定することになります。しかしながら今回はcore20を使っています。core20はまだ開発中のgnome-3-38
しかサポートしていません。そこで今回はgnome-3-38
を指定することにしました
ここまで記述できたらもう一度ビルドしてみましょう。ちなみに開発中のエクステンションを使用するために--enable-experimental-extensions
」
$ snapcraft --debug --enable-experimental-extensions (中略) *EXPERIMENTAL* extensions enabled. *EXPERIMENTAL* extension 'gnome-3-38' enabled. (中略) Building gnome-3-38-extension (後略)
gnome-3-38
に関するログがいろいろ追加されていますね。
たとえばless thorium-reader-snap_
」
snapパッケージのテストと修正
さて、
$ sudo snap install thorium-reader-snap_0.1_amd64.snap --dangerous --devmode thorium-reader-snap 0.1 installed
まず第654回でも紹介したように、--dangerous
」confinement
をdevmode
にしているため、--devmode
」
インストール中apps
の中で個別に記載する必要があるのですが、
実際に接続されたinterfaceを確認してみましょう。
$ snap connections thorium-reader-snap Interface Plug Slot Notes content[gnome-3-38-2004] thorium-reader-snap:gnome-3-38-2004 gnome-3-38-2004:gnome-3-38-2004 - content[gtk-3-themes] thorium-reader-snap:gtk-3-themes gtk-common-themes:gtk-3-themes - content[icon-themes] thorium-reader-snap:icon-themes gtk-common-themes:icon-themes - content[sound-themes] thorium-reader-snap:sound-themes gtk-common-themes:sound-themes - desktop thorium-reader-snap:desktop :desktop - desktop-legacy thorium-reader-snap:desktop-legacy :desktop-legacy - gsettings thorium-reader-snap:gsettings :gsettings - opengl thorium-reader-snap:opengl :opengl - wayland thorium-reader-snap:wayland - - x11 thorium-reader-snap:x11 :x11 -
試したマシンはX11セッションで起動しているため、
次にThoriumを起動してみます。ちなみにapps
の名前がsnapパッケージ名と一致している場合は、thorium-reader-snap
」thorium
」thorium-reader-snap.
」
ちょっと長いですね。今回はGUIアプリケーションでありCLIから直接起動することはあまりないため、snap alias thorium-reader-snap.
」
まずは起動してみましょう。
$ thorium-reader-snap.thorium /snap/thorium-reader-snap/x1/opt/Thorium/thorium: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory
「libnss3.
がない」libnss3
も依存関係に書いてありました。デスクトップ関係は一通りgnome-3-38
エクステンション経由で利用できるのですが、libnss3.
は明示的にsnapパッケージに取り込む必要があるようです。
ところでエクステンションを追加する前には足りないライブラリが表示されていましたが、libnss3.
が足りないにも関わらず、prime
フェーズで行われます。エクステンション追加後の再ビルドでは、
Skipping prime thorium-reader (already ran)
各フェーズを再実行したい場合は、snapcraft clean
」
さて、parts
にstage-package
を追加してそこにlibnss3
をリストアップしましょう。他にも必要なものがあるならこのように記述してください。
parts:
thorium-reader:
source: https://github.com/edrlab/thorium-reader/releases/download/v1.6.0/EDRLab.ThoriumReader_1.6.0_amd64.deb
source-type: deb
plugin: dump
stage-packages:
- libnss3
もう一度パッケージをビルドし直して、
$ snapcraft --debug --enable-experimental-extensions $ sudo snap install thorium-reader-snap_0.1_amd64.snap --dangerous --devmode thorium-reader-snap 0.1 installed $ thorium-reader-snap.thorium
無事に起動できました。

EPUBファイルは右上の--devmode
」

ちなみに表示しているのは大好評発売中の

snapパッケージ版のThorium Readerに登録したEPUBファイルは~/snap/
」
これで最低限のsnapパッケージの作り方を把握できました。
デスクトップファイルのインストール
GUIアプリケーションはデスクトップファイルを作っておくと、
apps:
thorium:
command: opt/Thorium/thorium
extensions: [gnome-3-38]
desktop: usr/share/applications/thorium.desktop
parts:
thorium-reader:
source: https://github.com/edrlab/thorium-reader/releases/download/v1.6.0/EDRLab.ThoriumReader_1.6.0_amd64.deb
source-type: deb
plugin: dump
override-build: |
snapcraftctl build
sed -i 's|Icon=.*|Icon=/usr/share/icons/hicolor/0x0/apps/thorium.png|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
stage-packages:
- libnss3
追加したのはapps
のdeskotop
フィールドと、parts
のoverride-build
です。
snapパッケージではデスクトップファイルがあるなら、desktop
フィールドに記述するだけで、
本来はこれだけでいいのですが、
override-build
はbuild
フェーズの処理を上書きするためのフィールドです。あらかじめsnapcraftctl build
を呼び出して通常のbuild
フェーズを実施した上で、build
によって展開されたthorium.
を上書き変更しています。
再度ビルドし、
最後に今回作成した、snap/
」
name: thorium-reader-snap
base: core20
version: '0.1'
license: BSD-3-Clause
summary: EPUB reader based on the Readium Toolkit
description: |
Thorium Reader is an easy to use EPUB reading application for cross
platforms.
This is unofficial re-packing of the debian package provided by EDRLab.
grade: devel
confinement: devmode
compression: lzo
apps:
thorium:
command: opt/Thorium/thorium
extensions: [gnome-3-38]
desktop: usr/share/applications/thorium.desktop
parts:
thorium-reader:
source: https://github.com/edrlab/thorium-reader/releases/download/v1.6.0/EDRLab.ThoriumReader_1.6.0_amd64.deb
source-type: deb
plugin: dump
override-build: |
snapcraftctl build
sed -i 's|Icon=.*|Icon=/usr/share/icons/hicolor/0x0/apps/thorium.png|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
stage-packages:
- libnss3
Snap Storeで公開するためには、confinement: devmode
」confinement: strict
」
次回以降でstrictモード化する際の手順を紹介する予定です。