Ubuntu Weekly Recipe

第656回 EPUBリーダーをsnapパッケージ化する

この記事を読むのに必要な時間:およそ 9 分

第654回ではsnapパッケージの基本的な話を紹介しました。今回はGUIアプリケーションをsnapパッケージ化する際の手順について,ひとつずつ具体的に説明していきましょう。

snapパッケージの際に気をつけるべきこと

snapパッケージを作る際は,まず次のようなことがらに気をつける必要があります。

  1. GUIアプリケーションか,CLIアプリケーションか
  2. システムファイルにアクセスする必要があるかどうか
  3. サードパーティのカーネルモジュールが必要かどうか
  4. パッケージ化対象のパッケージフォーマットは何か

snapパッケージはGUIアプリケーションか,CLIアプリケーションかで考えるべきことが大きく変わります。第654回でも説明したようにsnapパッケージは「依存するほとんどすべてのソフトウェアをパッケージの中に内包する」仕組みのフォーマットです。GUIアプリケーションは,やれGTKだ,やれQtだ,とさまざまなライブラリが必要になるため,それをすべてパッケージに同梱してしまうととても大きなサイズになってしまうのです。よってGUI向けのツールキットに関してはSnapcraft Extentionsという形で,外部のsnapパッケージのリソースを活用できる仕組みが備わっています。

GUIアプリケーションをsnapパッケージにする場合は,まずどのツールキットとextensionを使うかを検討しなくてはなりません。逆にCLIアプリケーションに関しては,必要最低限のリソース・ライブラリだけで済むことも多いでしょう。

2番目の「システムファイルにアクセスする必要があるかどうか」については,いわゆるシステム上の/usr/lib/etcやデバイスファイルなどの,ホスト上のファイルへのアクセスが必要かどうかとなります。snapパッケージはDockerなどと同じようにホストからは独立したファイルシステムの中で動作します。このためホストのファイルやディレクトリへはアクセスできません。唯一の例外はホームディレクトリです。それ以外のファイルやディレクトリにアクセスしたいなら,classic confinementなパッケージとして作らなくてはなりません。classicパッケージは,Snap Storeで公開する前に人間によるレビューを受ける必要があります。なお,ファイルによっては,適切なinterfaceを利用すればアクセスできます。

3番目の「サードパーティのカーネルモジュールが必要かどうか」では,VirtualBoxのようにDKMSを使ってカーネルモジュールをビルド・ロードするようなソフトウェアかどうかを確認しています。原則としてこのような対応が必要なパッケージは,snap化には向いていません※1⁠。これはsnapパッケージからたとえばカーネルモジュールは従来の方法でパッケージ化しておいて,そのモジュールパッケージがインストールされているなら,snapパッケージ側の挙動を変えるみたいな実装です。そういった実装も可能ではあるものの,そこまでするならsnapパッケージ化する意味は薄くなってくるでしょう。

※1
一応カーネルモジュールのロード・アンロードのためのinterfaceは存在するものの,これを利用するためにはレビューを受ける必要があります。

ここまではホストのリソースへのアクセスの話でしたが,4番目の「パッケージ化対象のパッケージフォーマットは何か」は,パッケージングの話です。snapパッケージの元となるデータは,単なるソースアーカイブから,debファイル,pipやcargoでインストールできるものに至るまで,さまざまなデータフォーマットやビルド方法が存在します。そこでsnapパッケージのビルドツールであるsnapcraftでは,snapcraft pluginsという名前で,さまざまな言語のパッケージング方法をサポートしています。元データのフォーマットがわかっているなら,どのプラグインを使うかをあらかじめ決めておくと,snapパッケージの作成を省力化できます。

上記を自問自答した上で,まずはsnapパッケージ化の是非を検討すると良いでしょう。残念ながら世にあるソフトウェアのすべてがsnapパッケージに適しているわけではありません。むしろ従来のパッケージが向いているケースのほうが絶対数は多いかもしれません。snapと競合するFlatpakやAppImage,場合によってはDockerイメージを使えば楽にパッケージングできるケースもあるでしょう。

snapパッケージはあくまで「ソフトウェアの開発者が楽にパッケージングできる」ことが主題のはずなので,⁠なんかうまくいかない」と思ったら無理に使おうとせず,是非他の方法も試してみてください。

「Thorium Reader」をsnapパッケージ化するための検討

さて,今回は第634回のクロスプラットフォームで動作するEPUBリーダー『Thorium Reader』で紹介されたEPUBリーダーをsnapパッケージ化してみましょう。まずは先ほどの条件を見直してみます。

  1. GUIかCLIか:GUIアプリケーション
  2. システムファイルにアクセスする必要があるかどうか:不要
  3. サードパーティのカーネルモジュールが必要かどうか:不要
  4. パッケージフォーマットは何か:debもしくはnpm

2については,とりあえずEPUBリーダーとして基本的な機能を動かすだけなら,不要となります。EPUBファイルもXDG_CONFIG_HOME~/snap/<パッケージ名>/<バージョン>/.configに保存するため,ホームディレクトリの他のディレクトリへのアクセス権もなくても動きます。ただしEPUB内の動画の再生など,特別なことをする場合は必要になるかもしれません。そのあたりは今後動作確認しながら検討することにします。パッケージを作る際は「最低限の機能を動かす上において」という前提で確認すると良いでしょう。

4については,今回はThoriumが配布しているdebパッケージからsnapパッケージを作ることにします。将来的にはnpmやソースコードから作る形にしても良いでしょう。

それでは実際にパッケージ化を進めていきます。第654回でも説明したように,snapパッケージを作るためにはいくつかのツールをインストールしておく必要があります。最低限,次のコマンドを実行すれば大丈夫です。

$ sudo snap install snapcraft --classic
$ sudo snap install multipass

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。