Ubuntu Weekly Recipe

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

第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パッケージ化する意味は薄くなってくるでしょう。

ここまではホストのリソースへのアクセスの話でしたが、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

ベースのYAMLファイルを作成する

snapパッケージはYAMLファイルによってそのメタデータを管理しています。ベースのYAMLファイルはsnapcraftコマンドで生成可能です。

$ mkdir thorium-reader-snap && cd $_
$ snapcraft init

作られるのはsnap/snapcraft.yamlだけです。今回はひたすらこのファイルを編集していきます。

まずはパッケージ名を決めましょう。もちろん、パッケージ名を付けなくてもテストビルドは可能です。しかしながら、ビルド時にMultipassがビルド用の小さな仮想マシンを作成する際に、仮想マシンの名前がパッケージの名前で作られてしまうのです。よって先にパッケージ名を決めておいたほうが効率的です。

snapパッケージの名前は、そのままsnap findコマンドなどで検索したときに表示される名前になります。Snap Storeで公開することを考えると、他のパッケージと名前がかぶってはいけません。良い名前を思いついたら、snap info パッケージ名ですでに存在しないか確認しておきましょう。

ちなみにsnapパッケージはソフトウェアの開発者がパッケージング・管理することが理想です。つまりソフトウェアのソースコードリポジトリにsnap/snapcraft.yamlが存在し、ソフトウェアのCIのフックに合わせて自動的に新しいパッケージが作成・公開されるようになることを期待しています[2]⁠。

つまりあるソフトウェアのsnapパッケージを作る際は、そのソフトウェア名と一致するパッケージ名をオフィシャルの開発者のために残しておくほうが良いでしょう。サードパーティが別名でパッケージングする際には、ソフトウェア名-snapsnap-ソフトウェア名とかソフトウェア名-機能なんて名前を付けるケースをちらほら見かけます。

今回は「Thorium Reader」なんで「thorium-reader-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以外だとversiongrade以下はそのままで、summarydescriptionはオフィシャルの紹介を参考に、それらしい説明を付けておきました。licenseも公式サイトや配布しているパッケージの情報を元に付けています。SPDXなフォーマットに合致するものがあればそれを使いましょう。未設定だとプロプライエタリ扱いになります。

ポイントはbasecore20にしていることです。core20(Ubuntu Core 20)は先月リリースされたばかりの新しいUbuntu CoreですUbuntu Weekly Topics 2021年2月5日号⁠。新規にパッケージングをするならより新しいUbuntu 20.04 LTSベースのcore20を使いたいところではあるものの、core20はリリースされたばかりでまだ周辺のプラグイン等が一部足りていません[3]⁠。将来的にsnapcraftが生成するテンプレートがcore20に変わるまでは、core18を使うほうが無難です。

しかしながらThorium Readerの公式サイトによると、理由は不明なもののLinux版を動かすためには「glibc 2.28以降」との記載があります。Ubuntu 18.04 LTSがglibc 2.27、Ubuntu 20.04 LTSがglibc 2.31なので、今回はcore20を使うことにしました。

さらに、この時点でGitリポジトリ化しておけば、今後の修正内容の履歴の管理が楽になります。もちろんGit以外のバージョン管理ツールを使ってもかまいません。

$ 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パッケージに変換する

前項でパッケージの名前が決まり、最初のビルドが成功しました。そこで次はDebianパッケージをそのまま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)を記述します[4]⁠。

上記の例だとthorium-readerという名前のpartsが記述されています。この名前は任意の文字列を指定可能です。今回はすでにバイナリ化されているパッケージをそのまま利用するため、partsはひとつで十分です。たとえばthorium-readerをビルドするためには、特定のライブラリをビルドする必要がある場合などは、その数だけpartsの中身が増えていくことになるでしょう。

さて、partsの個々のコンポーネントには一般的にsourcepluginを書くことになります。sourceはそのままデータのURLを書きます。ネットワーク上のデータだけでなく、ローカルのファイルパスも指定可能です。今回はGitHubのリリースページにあるファイルを指定しました。source-typeでそのファイルをどう展開するかを記述します。たとえばsourceにGitリポジトリを、soruce-type「git」を指定して、さらにsource-tagでリリースタグを指定するような運用も可能です。

pluginがそのデータをどう利用するかのテンプレートとなります。最初に設定されていたnilはデータに対して「何もしない」プラグインです。たとえばソースデータがなくただ任意のパッケージをsnapパッケージに取り込んでおきたいときや、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パッケージのツリーを作る際にいくつか警告が出ています

最後の警告は実際にインストールされるバイナリを精査して、本来snapパッケージに同梱されるべきライブラリをリストアップしてくれています。これらは本来はpartsstage-packagesに記述すべきです。

しかしながらデスクトップアプリケーションに関しては、最低限必要な項目が「エクステンション」としてまとまっています。そこでこれらを解決する前に、先にappsについての記述を説明しましょう。

ユーザーに見せる部分となるappsを記述する

parts「何をsnapパッケージに同梱するか」を記述しています。これにより構築されたパッケージツリーの中で、「どんなふうにユーザーにパッケージの中身を見せるか」を記述するのがappsです。

サンプルパッケージの段階ではappsは存在しませんでした。このため、snapパッケージをインストールしてもユーザーは直接そのパッケージの中身を見るしかできません。具体的にはThorium本体を起動しようとすると、/snap/thorium-reader-snap/current/opt/Thorium/thoriumみたいな感じで実行する必要がでてくるのです。

これでは不便ですし、そもそもこのままだとローカルのデスクトップ環境と連携できないため、Thorium Reader本体は起動できません。たとえば先ほどのメッセージにあったように必要なライブラリが足りない結果、⁠Not found」のようなエラーメッセージが表示されるでしょう。

Thorium ReaderのようなGUIアプリケーションについては、このあたりの諸々をパッケージングを行う人ごとに解決するのは大変なので、あらかじめ仕組みが用意されています。それがSnapcraft Extensionsです。これは別の設定済みのsnapパッケージを他のsnapパッケージからも流用できる仕組みです。

GUIアプリケーションを作るなら、snapcraftのデスクトップアプリケーションのドキュメントを一通り確認した上で、どのエクステンションを使うか決めると良いでしょう。特にsnapパッケージで日本語入力を行えるようにしたいのなら、これらのエクステンションの利用は必須だと考えてください。

今回は次のような記述をsnap/snapcraft.yamlに追加します。

compression: lzo

apps:
  thorium:
    command: opt/Thorium/thorium
    extensions: [gnome-3-38]
  • snapパッケージの圧縮方法をxzからlzoに変更しました
  • アプリケーション名としてthoriumを使います
  • opt/Thorium/thoriumをユーザーから見えるようにしました
  • エクステンションとしてgnome-3-38を利用します

appsを指定することで、そのアプリケーション名のシンボリックリンクが/snap/bin/以下に作られます。Ubuntuだと環境変数PATH/snap/bin/が入っているので、そのコマンドをそのまま実行できるようになるわけです。commandはそのアプリケーション名が実行されたときに呼び出すコマンドです。たとえばコマンドを実行する前に事前準備が必要なら、commandに何かスクリプトを指定したり、command-chainで複数のコマンドを指定することになります。

大事なのがextensionsです。何を指定するかはサポートされているエクステンション一覧を参照してください。GTKアプリケーションなら、今ならgnome-3-34を指定することになります。しかしながら今回はcore20を使っています。core20はまだ開発中のgnome-3-38しかサポートしていません。そこで今回はgnome-3-38を指定することにしました[5]⁠。

ここまで記述できたらもう一度ビルドしてみましょう。ちなみに開発中のエクステンションを使用するために--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_0.1_amd64.snapを実行すると、どんなファイルがインストールされるか確認できます。

snapパッケージのテストと修正

さて、必要最低限の設定はできたので作ったsnapパッケージをインストールしてみましょう。

$ sudo snap install thorium-reader-snap_0.1_amd64.snap --dangerous --devmode
thorium-reader-snap 0.1 installed

まず第654回でも紹介したように、ローカルで作ったsnapパッケージは未署名な状態です。そのためインストールするなら--dangerousが必要です。さらに今回はconfinementdevmodeにしているため、--devmodeも必要になります。

インストール中「Autoconnect…」みたいなメッセージが表示されたかもしれません。これはsnapパッケージのリソース管理である「interface」に接続したときのメッセージです。GUIアプリケーションだとたとえば、X Window SystemやD-Busまわりの接続が必要です。これらは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セッションで起動しているため、WaylandのSlotは空になっていますが、他は問題なく繋がっているようです。

次にThoriumを起動してみます。ちなみにappsの名前がsnapパッケージ名と一致している場合は、snapパッケージ名がそのままコマンド名になります。そうでない場合は、⁠snapパッケージ名.app名」の名前になります。今回はsnapパッケージ名がthorium-reader-snapで、app名がthoriumなのでthorium-reader-snap.thoriumがコマンド名となります。

ちょっと長いですね。今回はGUIアプリケーションでありCLIから直接起動することはあまりないため、気にしないことにします。どうしても短縮したいならsnap alias thorium-reader-snap.thorium thoriumのようにエイリアスを作ってしまうと良いでしょう。

まずは起動してみましょう。

$ 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.soがない」と言われてしまいましたね。実はオリジナルのThorium Readerのdebパッケージはデスクトップ関係だけでなく、libnss3も依存関係に書いてありました。デスクトップ関係は一通りgnome-3-38エクステンション経由で利用できるのですが、libnss3.soは明示的にsnapパッケージに取り込む必要があるようです。

ところでエクステンションを追加する前には足りないライブラリが表示されていましたが、追加後はlibnss3.soが足りないにも関わらず、その旨が表示されなかったことに疑問を感じるかもしれません。必要ライブラリの精査はprimeフェーズで行われます。エクステンション追加後の再ビルドでは、エクステンション関連の各フェーズは実行されるものの、元のパッケージは状態が変わっていないので再実行されません。実際のログを見てみると次のようにスキップされていることがわかるはずです。

Skipping prime thorium-reader (already ran)

各フェーズを再実行したい場合は、一度snapcraft cleanしてからビルドしてください。正式にパッケージを公開する際にも「cleanしてからビルド」は試しておいたほうがいいでしょう[6]⁠。

さて、今回はpartsstage-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

無事に起動できました。

図1 日本語もきちんと表示されているし、日本語入力も可能
図1

EPUBファイルは右上の「+」マークからディレクトリツリーをたどることで追加可能ですし、ウィンドウへのファイルのドラッグアンドドロップでも追加できます。これは現在は--devmodeを使うことで、リソースへのアクセス権が制限されていないことが理由です。

図2 EPUBファイルを表示している状態。画像や検索、目次の表示も問題ない
図2

ちなみに表示しているのは大好評発売中のうぶんちゅ! まがじん ざっぱ~ん♪ vol.11です。

図3 本文の日本語検索も可能。ちなみに本棚では書名による検索も可能だが、完全一致でないとマッチしない
図2

snapパッケージ版のThorium Readerに登録したEPUBファイルは~/snap/thorium-reader-snap/リビジョン/.config/EDRLab.ThoriumReader/publications/以下に保存されます。⁠リビジョン」はsnapパッケージのビルド番号です。

これで最低限のsnapパッケージの作り方を把握できました。

デスクトップファイルのインストール

GUIアプリケーションはデスクトップファイルを作っておくと、GUIシェルから検索・起動できて便利です。Thorium Readerにはすでにデスクトップファイルが存在するので、それを利用することにしましょう。

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

追加したのはappsdeskotopフィールドと、partsoverride-buildです。

snapパッケージではデスクトップファイルがあるなら、そのパスをdesktopフィールドに記述するだけで、snapパッケージインストール時に自動的に登録されます。

本来はこれだけでいいのですが、問題は「アイコン」です。デスクトップファイルのアイコンは適切な場所にインストールされないと参照できません。今回は参照先をオリジナルのシンボル名からフルパスに変更して回避しています。

override-buildbuildフェーズの処理を上書きするためのフィールドです。あらかじめsnapcraftctl buildを呼び出して通常のbuildフェーズを実施した上で、buildによって展開されたthorium.desktopを上書き変更しています。

再度ビルドし、snapパッケージを再インストールしてみましょう。GNOME ShellのDashからThorium Readerを検索・起動できるようになったはずです。

最後に今回作成した、snap/snapcraft.yamlを表示しておきます。

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: devmodeconfinement: strictに変更しなくてはなりません。strictモードではさまざまなリソースのアクセスが制限されるため、Thorium Readerがうまくうごくようになるためにさらにいくつかの修正が必要になります。

次回以降でstrictモード化する際の手順を紹介する予定です。

おすすめ記事

記事・ニュース一覧