================================================================ flatpak を使って python application をパッケージングしてみる試み ================================================================ flatpak って? ============== http://flatpak.org/ Linux 方面の最近の流れとして、デスクトップアプリケーションとかもコンテナ技術でパッケージング・動作させようぜ、というのがあり、その一つ。 xdg-app と呼ばれていたもの。 デスクトップアプリケーション向けなので、 docker と違って一般ユーザーで普通に実行できたりとか、 X/Wayland とやり取りできたりとか、その他色々ある。 出てくる用語としては、 - application + アプリケーション + 実行ファイルと、必要があればその依存ライブラリなどがパッケージングされている + 実行時は ``/app`` 以下に mount される - runtime + 複数の application から参照される共通のシステムイメージ部分 + 実行時は ``/usr`` 以下に mount される - sdk + runtime + ビルドに必要なモノ + コンパイラとかヘッダファイルとかが入っている + アプリケーションをパッケージングするときはこちらのイメージを使ってビルドを通し、 実行時は runtime を使ってディスク容量を節約する、という使い分けがされる (多分) - repository + application や runtime が置かれてるトコ 辺り。 使い方としては、まず repository を登録し、次に repository から application をインストールし、そして実行する。 という感じ。 パッケージングしてみる ====================== さて、パッケージングしてみる。 パッケージング対象はとりあえず何でもいいのだけど、 python 製のアプリケーションでたまに名前を聞くものとして、 `httpie `_ にしよう。 まずは runtime/sdk として何を利用するかだが、 GNOME な人々が配っている ``org.freedesktop.BasePlatform`` に python も含まれているので、コレを使おう。 .. code:: console $ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo $ flatpak --user install gnome org.freedesktop.BasePlatform Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome 6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds $ flatpak --user install gnome org.freedesktop.BaseSdk Installing: org.freedesktop.BaseSdk/x86_64/1.4 from gnome 11 delta parts, 21 loose fetched; 98421 KiB transferred in 23 seconds 続いて実際のパッケージング作業。 ここでは ``flatpak builder`` という、設定ファイルから全部いい感じにやってくれるツールが存在するのだが、 今の所 ``autotools`` やら ``cmake`` やら前提になっていて、 python アプリケーションのパッケージングには使えない。 ということで、諸々手動でやる。 流れとしては、 1. ``flatpak build-init`` で、簡単な雛形ディレクトリを作成し、 2. ``flatpak build`` で、その雛形 + runtime/sdk 内に入ってコマンドを実行、インストール作業を行い、 3. ``flatpak build-finish`` でメタデータの設定やらを行って、 4. ``flatpak build-export`` で repository に書き出し。 という感じ。 今回はコレを shell script にまとめました。 ``build-httpie.bash``: .. code:: bash #!/bin/bash REPOSITORY="${HOME}/repos/flatpak/u7fa9.org" PACKAGE="httpie" VERSION="0.9.9" BUILD_FINISH_ARGS=( --share=network --command=http ) _APP="org.u7fa9.${PACKAGE}" _RUNTIME="org.freedesktop.BasePlatform" _SDK="org.freedesktop.BaseSdk" _RUNTIME_VERSION="1.4" build_location="$(mktemp -d "${_APP}".XXXXXXX)" flatpak build-init "${build_location}" "${_APP}" "${_SDK}" "${_RUNTIME}" "${_RUNTIME_VERSION}" # 先述したように、 application は /app 以下に mount されるので、この中に必要なものを全て入れる必要がある。 # 今回は /app 以下に virtualenv を作成し、 httpie を pip install する。 flatpak build "${build_location}" python3 -m venv /app flatpak build --share=network "${build_location}" /app/bin/pip install "${PACKAGE}==${VERSION}" flatpak build-finish "${BUILD_FINISH_ARGS[@]}" "${build_location}" flatpak build-export "${REPOSITORY}" "${build_location}" "${VERSION}" .. code:: console $ bash build-httpie.bash You are using pip version 6.0.8, however version 9.0.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. Collecting httpie==0.9.9 Using cached httpie-0.9.9-py2.py3-none-any.whl Collecting Pygments>=2.1.3 (from httpie==0.9.9) Using cached Pygments-2.2.0-py2.py3-none-any.whl Collecting requests>=2.11.0 (from httpie==0.9.9) Using cached requests-2.13.0-py2.py3-none-any.whl Installing collected packages: requests, Pygments, httpie Successfully installed Pygments-2.2.0 httpie-0.9.9 requests-2.13.0 Please review the exported files and the metadata Commit: 5c202dac8309b51af168f71c70a92ea564b536f67a5e50f5b6181c6b7a5f4f39 Metadata Total: 277 Metadata Written: 139 Content Total: 1324 Content Written: 1262 Content Bytes Written: 16052289 (16.1 MB) できあがり。 公開する ======== Repository を HTTP でアクセスできるどこかにコピーして置くだけ。 ``https://u7fa9.org/flatpak/repo/`` インストールする ================ 別環境にて。 gnome と上記の repository を追加して、インストールする。 .. code:: console $ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo $ flatpak --user remote-add --no-gpg-verify u7fa9 https://u7fa9.org/flatpak/repo/ $ flatpak --user install u7fa9 org.u7fa9.httpie Required runtime for org.u7fa9.httpie/x86_64/0.9.9 (org.freedesktop.BasePlatform/x86_64/1.4) is not installed, searching... Found in remote gnome, do you want to install it? [y/n]: y Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome 6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds Installing: org.u7fa9.httpie/x86_64/0.9.9 from u7fa9 139 metadata, 1261 content objects fetched; 5783 KiB transferred in 2 seconds 実行する ======== .. code:: console $ flatpak run org.u7fa9.httpie https://u7fa9.org/ HTTP/1.1 200 OK Accept-Ranges: bytes Connection: keep-alive Content-Length: 337 Content-Type: text/html; charset=utf-8 Date: Mon, 06 Feb 2017 11:34:21 GMT ETag: "4ce914bc-151" Last-Modified: Sun, 21 Nov 2010 12:46:52 GMT Server: nginx index 動いた。