mcpField
P
packaging-tauri-for-linux

packaging-tauri-for-linux

github.com/dchuk開発36158 回インストール40 週間前に更新
リポジトリ

packaging-tauri-for-linux について

Tauri アプリを Linux 向けにパッケージ化する開発者向けスキルです。AppImage、Debian、RPM、Flatpak、Snap、AUR の設定とビルドに加え、互換性や署名の注意点を説明します。

主な機能

  1. 016 種類の Linux 形式でパッケージ化
  2. 02パッケージのメタデータと依存関係を設定
  3. 03ARM 向け Debian パッケージのクロスコンパイル
  4. 04RPM パッケージへの署名
  5. 05Flatpak パッケージのビルドとテスト
  6. 06glibc の互換性要件を確認

活用シーン

  1. 01AppImage または Debian のリリース作成
  2. 02Flatpak または Snap での配布準備
  3. 03CI での Linux パッケージのビルド
  4. 04AUR を通じたパッケージ公開

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dchuk/claude-code-tauri-skills --skill packaging-tauri-for-linux

インストール後、Claude Code で/packaging-tauri-for-linuxを入力して読み込まれたか確認します。

詳細

Linux 向け Tauri アプリケーションのパッケージ化

重要なビルド要件

glibc の互換性:サポート対象とする最も古いベースシステム(例:Ubuntu 22.04 ではなく Ubuntu 18.04)でビルドしてください。再現可能なビルドには Docker または GitHub Actions を使用してください。

フォーマットの概要

フォーマット用途自動更新インストール
AppImage汎用、ポータブル手動直接実行
DebianDebian/Ubuntuリポジトリ経由dpkg -i
RPMFedora/RHEL/openSUSEリポジトリ経由rpm -i
Flatpakサンドボックス化、Flathub組み込みflatpak install
SnapUbuntu Store組み込みsnap install
AURArch Linuxヘルパー経由makepkg -si

AppImage

インストール不要の自己完結型実行可能バンドルです。

{
  "bundle": {
    "linux": {
      "appimage": {
        "bundleMediaFramework": true,
        "files": { "/usr/share/README.md": "../README.md" }
      }
    }
  }
}
オプション説明
bundleMediaFrameworkGStreamer を含めます(サイズが増加し、ugly プラグインにはライセンス上の懸念があります)
files追加ファイル(パスは /usr/ で始まる必要があります)
npm run tauri build -- --bundles appimage

ARM:クロスコンパイルはサポートされていません。GitHub の ubuntu-22.04-arm ランナーを使用してください。


Debian パッケージ(.deb)

{
  "bundle": {
    "linux": {
      "deb": {
        "depends": ["libssl3", "libasound2"],
        "files": { "/usr/share/doc/myapp/README": "../README.md" },
        "section": "utils",
        "priority": "optional"
      }
    }
  }
}

デフォルトの依存関係:libwebkit2gtk-4.1-0、libgtk-3-0、libappindicator3-1(トレイを使用する場合)。

npm run tauri build -- --bundles deb
ARM クロスコンパイル
# ARM64
rustup target add aarch64-unknown-linux-gnu
sudo apt install gcc-aarch64-linux-gnu

.cargo/config.toml:

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu cargo tauri build --target aarch64-unknown-linux-gnu

RPM パッケージ

{
  "bundle": {
    "linux": {
      "rpm": {
        "depends": ["openssl"],
        "conflicts": ["oldapp"],
        "obsoletes": ["legacyapp < 2.0"],
        "provides": ["myapp-bin"],
        "license": "MIT",
        "preInstallScript": "scripts/pre-install.sh",
        "postInstallScript": "scripts/post-install.sh"
      }
    }
  }
}

スクリプトには次の値が渡されます:1(インストール)、2(アップグレード)、0(アンインストール)。

npm run tauri build -- --bundles rpm
署名
gpg --gen-key && gpg --export-secret-keys --armor > private.key
export TAURI_SIGNING_RPM_KEY=$(cat private.key)
export TAURI_SIGNING_RPM_KEY_PASSPHRASE="passphrase"
デバッグコマンド
rpm -qip pkg.rpm   # Info
rpm -qlp pkg.rpm   # Files
rpm -qp --scripts pkg.rpm  # Scripts
rpm -Kv pkg.rpm    # Verify signature

Flatpak

前提条件
sudo apt install flatpak flatpak-builder  # Ubuntu/Debian
flatpak install flathub org.gnome.Platform//46 org.gnome.Sdk//46
マニフェスト(flatpak-builder.yaml)
id: com.example.myapp
runtime: org.gnome.Platform
runtime-version: '46'
sdk: org.gnome.Sdk
command: myapp

finish-args:
  - --socket=wayland
  - --socket=fallback-x11
  - --device=dri
  - --share=ipc
  - --share=network
  - --talk-name=org.kde.StatusNotifierWatcher
  - --filesystem=xdg-run/tray-icon:create

modules:
  - name: binary
    buildsystem: simple
    sources:
      - type: file
        path: flatpak.metainfo.xml
      - type: file
        url: https://github.com/user/repo/releases/download/v1.0.0/myapp_1.0.0_amd64.deb
        sha256: <hash>
        only-arches: [x86_64]
    build-commands:
      - mkdir deb-extract && ar -x *.deb --output deb-extract
      - tar -C deb-extract -xf deb-extract/data.tar.gz
      - install -Dm755 deb-extract/usr/bin/myapp /app/bin/myapp
      - sed -i 's/^Icon=.*/Icon=com.example.myapp/' deb-extract/usr/share/applications/myapp.desktop
      - install -Dm644 deb-extract/usr/share/applications/myapp.desktop /app/share/applications/com.example.myapp.desktop
      - install -Dm644 deb-extract/usr/share/icons/hicolor/128x128/apps/myapp.png /app/share/icons/hicolor/128x128/apps/com.example.myapp.png
      - install -Dm644 flatpak.metainfo.xml /app/share/metainfo/com.example.myapp.metainfo.xml
MetaInfo(flatpak.metainfo.xml)
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
  <id>com.example.myapp</id>
  <name>My App</name>
  <summary>Short description</summary>
  <metadata_license>CC0-1.0</metadata_license>
  <project_license>MIT</project_license>
  <description><p>Longer description.</p></description>
  <launchable type="desktop-id">com.example.myapp.desktop</launchable>
  <url type="homepage">https://example.com</url>
  <releases><release version="1.0.0" date="2025-01-01"/></releases>
</component>
ビルドとテスト
flatpak-builder --force-clean --user --install flatpak flatpak-builder.yaml
flatpak run com.example.myapp
トレイアイコンの修正
TrayIconBuilder::new()
    .icon(app.default_window_icon().unwrap().clone())
    .temp_dir_path(app.path().app_cache_dir().unwrap())
    .build().unwrap();
Flathub への提出
  1. https://github.com/flathub/flathub をフォークします
  2. new-pr からブランチを作成し、マニフェストを追加します
  3. PR を作成し、フィードバックに対応して、リポジトリへのアクセス権を取得します

Snap パッケージ

前提条件
sudo apt install snapd
sudo snap install core22
sudo snap install snapcraft --classic

https://snapcraft.io でアプリを登録します

snapcraft.yaml
name: myapp
base: core22
version: '1.0.0'
summary: Short description (max 79 chars)
description: Longer description.
grade: stable
confinement: strict

layout:
  /usr/lib/x86_64-linux-gnu/webkit2gtk-4.1:
    bind: $SNAP/usr/lib/x86_64-linux-gnu/webkit2gtk-4.1

apps:
  myapp:
    command: usr/bin/myapp
    desktop: usr/share/applications/myapp.desktop
    extensions: [gnome]
    plugs: [home, network, audio-playback, desktop, wayland, x11, opengl]

parts:
  myapp:
    plugin: nil
    source: .
    build-packages: [nodejs, npm, curl, libwebkit2gtk-4.1-dev, libssl-dev, libayatana-appindicator3-dev]
    stage-packages: [libwebkit2gtk-4.1-0, libayatana-appindicator3-1]
    override-build: |
      curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
      . "$HOME/.cargo/env"
      npm install && npm run tauri build -- --bundles deb
      mkdir -p deb-extract && ar -x src-tauri/target/release/bundle/deb/*.deb --output deb-extract
      tar -C deb-extract -xf deb-extract/data.tar.gz
      cp -r deb-extract/usr $SNAPCRAFT_PART_INSTALL/
ビルドと公開
sudo snapcraft
snap run myapp
snapcraft login && snapcraft upload --release=stable myapp_1.0.0_amd64.snap

AUR(Arch User Repository)

セットアップ
# Create account at https://aur.archlinux.org, configure SSH
git clone ssh://[email protected]/myapp.git
PKGBUILD(バイナリ)
pkgname=myapp
pkgver=1.0.0
pkgrel=1
pkgdesc="Description"
arch=('x86_64' 'aarch64')
url="https://github.com/user/myapp"
license=('MIT')
depends=('cairo' 'desktop-file-utils' 'gdk-pixbuf2' 'glib2' 'gtk3' 'hicolor-icon-theme' 'libsoup' 'pango' 'webkit2gtk-4.1')
source_x86_64=("$pkgname-$pkgver.deb::https://github.com/user/myapp/releases/download/v$pkgver/myapp_${pkgver}_amd64.deb")
sha256sums_x86_64=('SKIP')

package() { tar -xf data.tar.gz -C "$pkgdir"; }
PKGBUILD(ソース)
pkgname=myapp
pkgver=1.0.0
pkgrel=1
pkgdesc="Description"
arch=('x86_64')
url="https://github.com/user/myapp"
license=('MIT')
makedepends=('cargo' 'nodejs' 'npm' 'webkit2gtk-4.1' 'base-devel' 'openssl' 'libappindicator-gtk3')
depends=('cairo' 'desktop-file-utils' 'gdk-pixbuf2' 'glib2' 'gtk3' 'hicolor-icon-theme' 'libsoup' 'pango' 'webkit2gtk-4.1')
source=("$pkgname-$pkgver.tar.gz::https://github.com/user/myapp/archive/v$pkgver.tar.gz")
sha256sums=('SKIP')

build() { cd "$pkgname-$pkgver" && npm install && npm run tauri build -- --bundles deb; }
package() { cd "$pkgname-$pkgver" && tar -xf src-tauri/target/release/bundle/deb/*.deb && tar -xf data.tar.gz -C "$pkgdir"; }
インストールスクリプト(myapp.install)
post_install() { update-desktop-database -q; gtk-update-icon-cache -q -t -f usr/share/icons/hicolor; }
post_upgrade() { post_install; }
post_remove() { post_install; }
提出
makepkg --printsrcinfo > .SRCINFO
makepkg -si  # Test
git add PKGBUILD .SRCINFO myapp.install && git commit -m "myapp 1.0.0" && git push

環境変数

GUI アプリは $PATH を継承しません。fix-path-env-rs を使用してください:

[dependencies]
fix-path-env = "0.1"
fn main() {
    fix_path_env::fix();
    tauri::Builder::default().run(tauri::generate_context!()).expect("error");
}

GitHub Actions の例

name: Build Linux
on: [push]
jobs:
  build:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - run: sudo apt update && sudo apt install -y libwebkit2gtk-4.1-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - uses: dtolnay/rust-action@stable
      - run: npm install && npm run tauri build -- --bundles deb,rpm,appimage
      - uses: actions/upload-artifact@v4
        with:
          name: linux-bundles
          path: src-tauri/target/release/bundle/**/*

コメント