Linux 用 AppImage を作る

1 ファイルで配れる AppImage を tauri build --bundles appimage で作る。ファイルの同梱、glibc 互換のためのビルド環境、libfuse2 が無いときの対処を示す。

ビルド・配布 対象: Tauri 2.x 更新日: 読了目安: 約5分 build-007
目次
  1. 前提条件
  2. 1. tauri.conf.json の設定
  3. 2. ビルドする
  4. 動作確認
  5. よくあるエラーと対処法
  6. 起動時に libfuse.so.2 が見つからない
  7. 別のマシンで GLIBC_2.xx not found
  8. linuxdeploy のダウンロードに失敗する
  9. ビルドは通るが動画・音声が再生されない
  10. OS ごとの違いと注意点
  11. 関連レシピ

AppImage は、アプリ本体と依存ライブラリを 1 つの実行ファイルに詰め込んだ Linux 向けのポータブル形式です。インストール不要で、ダウンロードして実行権限を付ければ Ubuntu でも Fedora でも動きます。パッケージマネージャに登録されない代わりに、配布側はディストリビューションごとに .deb / .rpm を用意する手間から解放されます。Tauri のバンドラーは linuxdeploy を自動取得して AppImage を組み立てるので、設定はほぼ不要です。

前提条件

  • Linux 上でビルドすること。WebKitGTK 4.1 系の開発パッケージなど、Tauri の Linux 依存関係が揃っていること(Hello World (Ubuntu))
  • file コマンド(Ubuntu の file パッケージ)。linuxdeploy が使用します
  • 初回ビルド時のインターネット接続。linuxdeploy と GTK プラグインが ~/.cache/tauri/ にダウンロードされます

プラグインや capability の権限は不要です。

1. tauri.conf.json の設定

AppImage は Linux の既定ターゲットに含まれているので、targets が "all" なら何もしなくても生成されます。明示するなら次のとおりです。

{
  "bundle": {
    "targets": ["appimage"],
    "linux": {
      "appimage": {
        "bundleMediaFramework": false,
        "files": {
          "/usr/share/my-notes/README.md": "../README.md"
        }
      }
    }
  }
}
  • bundleMediaFramework: <video> / <audio> を再生するアプリでは true にします。GStreamer 一式が同梱されるためサイズが 15〜35MB ほど増えます。Ubuntu 以外のビルド環境では同梱が不完全になることがあります
  • files: bundle.resources を使わずに任意のファイルを AppImage 内に置く指定。キー(配置先)は /usr/ で始める必要があります

通常のアセット同梱には bundle.resources を使ってください(画像やDBファイルを配布物に同梱する)。

2. ビルドする

npm run tauri build -- --bundles appimage

src-tauri/target/release/bundle/appimage/<productName>_<version>_amd64.AppImage が生成されます。ビルド中に strip が失敗する環境(一部の ARM や古い binutils)では、環境変数で無効化できます。

NO_STRIP=true npm run tauri build -- --bundles appimage

ARM64 向けの AppImage は linuxdeploy がクロスビルドに対応していないため、ARM 実機か QEMU 上でビルドする必要があります。

動作確認

生成物はそのままでは実行ビットが立っていないことがあるため、付与してから起動します。

chmod a+x my-notes_1.0.0_amd64.AppImage
./my-notes_1.0.0_amd64.AppImage

中身を確認したいときは展開できます。squashfs-root/usr/bin/ に実行ファイル、usr/lib/ に同梱ライブラリ、usr/share/applications/ に .desktop が入っています。

./my-notes_1.0.0_amd64.AppImage --appimage-extract
ls squashfs-root/usr/lib

よくあるエラーと対処法

起動時に libfuse.so.2 が見つからない

AppImage の実行には FUSE 2 が必要ですが、Ubuntu 22.04 以降や Fedora の最近のバージョンでは既定で入っていません。「dlopen(): error loading libfuse.so.2」という趣旨のメッセージで落ちる場合、配布先に次のいずれかを案内します。

# Ubuntu 22.04 / Debian 12
sudo apt install libfuse2
# Ubuntu 24.04
sudo apt install libfuse2t64
# FUSE なしで実行する(展開してから起動するので初回が遅い)
APPIMAGE_EXTRACT_AND_RUN=1 ./my-notes_1.0.0_amd64.AppImage

別のマシンで GLIBC_2.xx not found

「version `GLIBC_2.38' not found」という趣旨のエラーは、ビルド環境の glibc が実行環境より新しいことが原因です。AppImage は glibc を同梱しません。サポートしたい最も古いディストリビューション(Ubuntu 22.04 や Debian 12 が現実的な下限)でビルドするか、その環境の Docker コンテナ内でビルドしてください。

linuxdeploy のダウンロードに失敗する

プロキシ環境では初回の linuxdeploy 取得でタイムアウトします。HTTPS_PROXY を設定するか、ネットのある環境で作った ~/.cache/tauri/ をコピーしてください。

ビルドは通るが動画・音声が再生されない

bundleMediaFramework: false のままだと、実行環境に GStreamer のプラグインが揃っていない限り再生できません。true にして再ビルドし、それでも駄目なら実行環境側に gstreamer1.0-plugins-good などを入れます。

OS ごとの違いと注意点

  • AppImage は Linux 専用です。同じ Linux でも Alpine のような musl ベースの環境では動きません
  • サイズは素の .deb の 2〜6MB に対して 70MB 以上になります。ライブラリを同梱する形式の宿命なので、サイズを気にするなら Deb パッケージ を併用します
  • 実行してもアプリケーションメニューには登録されません。メニュー統合が必要なら .deb にするか、ユーザー側で AppImageLauncher などを使ってもらいます
  • AppImage はサンドボックスではありません。通常のバイナリと同じ権限で動きます
  • Wayland 環境で WebKitGTK の描画が乱れる場合は、環境変数 WEBKIT_DISABLE_COMPOSITING_MODE=1 を試す、という回避策が知られています

関連レシピ

参考リンク(公式ドキュメント)

Web Ninja

この記事を書いた人

Web Ninja ウェブエンジニア (Web Engineer)

会社員ネットワークエンジニアから独立してかれこれ 25 年以上 Web エンジニアとして活動中。普段は JavaScript と Node.js を自在に操り、時には C++ や Perl といった古流の技も嗜みます。近年は Tauri × Rust という新たな武器を手に、デスクトップアプリ開発の最前線を駆け抜けています。「作りたい」を「作れる」に変えるための、実践的な「技」をお届けします。

お問い合わせ: tauri.ninja@gmail.com

内容の誤り・動かないコードを報告する