Ubuntu Weekly Recipe

第654回 snapパッケージング入門

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

作成したパッケージのインストール

作成したsnapパッケージは次の方法でインストールできます。

$ sudo snap install my-snap-name_0.1_amd64.snap --dangerous --devmode
my-snap-name 0.1 installed

$ snap info my-snap-name
name:      my-snap-name
summary:   Single-line elevator pitch for your amazing snap
publisher: –
license:   unset
description: |
  This is my-snap's description. You have a paragraph or two to tell the
  most important story about your snap. Keep it under 100 words though,
  we live in tweetspace and your description wants to look good in the snap
  store.
refresh-date: today at 23:11 JST
installed:    0.1 (x1) 4kB devmode

confinementdevmodeなため,--demodeオプションは必須です※4⁠。将来的にSnap Storeで公開するためには--devmodeなしでインストールできるようにする必要があります。今はまだSnap Storeで署名されていないパッケージをインストールするため,--dangerousを付ける必要もあります。

※4
今回のサンプルパッケージはホストのリソースにアクセスする必要がないため,snap/snapcraft.yamlconfinementstrictに変えてビルドするという手もあります。

実際にパッケージの中身を見てみましょう。

$ ls -R /snap/my-snap-name/
/snap/my-snap-name/:
current  x1

/snap/my-snap-name/x1:
meta

/snap/my-snap-name/x1/meta:
snap.yaml

パッケージのメタデータだけがインストールされており他は何もないパッケージですね。ちなみにless my-snap-name_0.1_amd64.snapでも中身を確認できます。

サンプルパッケージを削除するには次のコマンドを実行してください。

$ sudo snap remove --purge my-snap-name
my-snap-name removed

適当なファイルを追加でインストールする

--debugオプションの動作確認も兼ねて,何か適当なファイルを追加でインストールしてみましょう。まずsnapcraft.yamlのpartsを次のように編集します。

parts:
  my-part:
    # See 'snapcraft plugins'
    plugin: nil
  my-part2:
    plugin: dump
    source: local-files/

dumpプラグインはソースツリーにある任意のファイルをそのままsnapパッケージに取り込むためのプラグインです。sourceで指定したファイルを,パッケージのルートファイルシステムの中にそのままコピーされます。ちなみにファイルとしてはローカルファイルだけでなく,HTTP経由のリソースやgitリポジトリなども指定可能です。

このままパッケージを作ってみましょう。今はまだlocal-filesが存在しないため,エラーになるはずです。

$ snapcraft --debug
Launching a VM.
Failed to pull source: unable to determine source type of 'local-files/'.
Check that the URL is correct or consider specifying `source-type` for this part. See `snapcraft help sources` for more information.
snapcraft-my-snap-name #

パッケージのビルドが失敗し,ビルド用仮想マシンのシェルが立ち上がりました。そこでlocal-filesディレクトリを作り,適当なファイルを配置してみましょう。ビルド用仮想マシンのシェルの中もしくはホスト上のパッケージディレクトリで次のコマンドを実行してください。

$ mkdir local-files
$ touch local-files/test.txt

ビルド用仮想マシンのシェルの中で再度snapcraftコマンドを実行します。

snapcraft-my-snap-name # snapcraft
(snip)
Snapped my-snap-name_0.1_amd64.snap
snapcraft-my-snap-name #

今度は無事にパッケージが完成したようです。exitコマンドでログアウトして,作られたパッケージの中身を確認してみましょう。

$ less my-snap-name_0.1_amd64.snap | cat
path:       "my-snap-name_0.1_amd64.snap"
name:       my-snap-name
summary:    Single-line elevator pitch for your amazing snap
version:    0.1 devmode
build-date: today at 23:21 JST
license:    unset
description: |
  This is my-snap's description. You have a paragraph or two to tell the
  most important story about your snap. Keep it under 100 words though,
  we live in tweetspace and your description wants to look good in the snap
  store.

*** Contents:
Parallel unsquashfs: Using 8 processors
2 inodes (1 blocks) to write

drwxr-xr-x root/root                43 2021-02-11 23:21
drwxr-xr-x root/root                32 2021-02-11 21:40 /meta
-rw-r--r-- root/root               407 2021-02-11 23:21 /meta/snap.yaml
-rw-rw-r-- root/root                 0 2021-02-11 23:20 /test.txt

きちんとlocal-files以下のtest.txtがインストールされるようになりました。

このようにsnapcraftは,構築エラー時にある程度のエラーメッセージとリファレンスを表示して,動作確認用の環境を提供してくれます。あとは「snapcraft.yamlを編集する」⁠ビルドする」を繰り返せば,求めるパッケージが作れるはずです。ちなみにビルド時のエラーのよくある例については公式ドキュメントのDebugging building snapsも参考になるでしょう。

著者プロフィール

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

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