🐥

TauriとLeptosで作るデスクトップアプリ(1)プロジェクトを作成する

2024/08/18に公開

はじめに

TauriとLeptosでデスクトップアプリを作っていきます。

  • Windows 11 Home
  • Rust 1.80
  • Tauri 2.0.1
  • Leptos 0.7.0-rc0

https://tauri.app/

https://leptos.dev/

関連記事

Rustプロジェクトを作成する

TauriとLeptosを使ったサンプルプロジェクトを作成します。公式ページにあるように、create-tauri-appを使うとテンプレートを作ってくれます。ここでは、あえてスクラッチから作っていきます。

https://github.com/leptos-rs/leptos/tree/main/projects/tauri-from-scratch

プロジェクトディレクトリを作成し、cargo initコマンドで初期化します。ディレクトリごと作りたいときは、cargo newコマンドでもOKです。

> mkdir tauri-leptos-example
> cd tauri-leptos-example
> cargo init

プロジェクトのルートディレクトリ(.)にあるCargo.tomlは、次のようになっています。

./Cargo.toml
[package]
name = "tauri-leptos-example"
version = "0.1.0"
edition = "2021"

[dependencies]

これを次のように変更します。

./Cargo.toml
[workspace]
resolver = "2"
members = []

[profile.release]
codegen-units = 1
lto = true

[workspace.package]
edition = "2021"

[workspace.dependencies]

プロジェクト全体はワークスペースで管理します。[profile.release]の設定は、wasmファイルを小さくするための設定のようです。また、ワークスペースの依存パッケージ[workspace.dependencies]は、まだ空です。

appsディレクトリの中に、

  • フロントエンド: Leptos (apps/src-ui)
  • バックエンド: Tauri (apps/src-tauri)

の2つのクレートを作ります。

> mkdir apps && cd apps
> cargo new src-tauri --lib
> cargo new src-ui --lib

それぞれのディレクトリにクレートが作成されました。

apps/src-tauri/Cargo.toml (apps/src-ui/Cargo.tomlも同様)
[package]
name = "src-tauri"
version = "0.1.0"
edition.workspace = true

[dependencies]

また、これらのクレートは自動でワークスペースに追加されています。

./Cargo.toml
[workspace]
resolver = "2"
members = ["apps/src-tauri", "apps/src-ui"]

# 略

プロジェクトルートに戻ってテストを実行します。

> cd ..
> cargo test
   Compiling src-ui v0.1.0 (...)
   Compiling src-tauri v0.1.0 (...)
:
test result: ok.  ...

src-uisrc-tauriの2つのクレートがコンパイルされ、テストにパスします。これでプロジェクトルートにあるワークスペースからクレートが認識されていることが確認できました。またプロジェクトルートにあるsrcディレクトリは削除します。現時点でのディレクトリ構成は、以下のようになっています。

tauri-leptos-example
├─ apps/
│  ├─ src-tauri/
│  │  ├─ src/
│  │  │  └─ lib.rs
│  │  └─ Cargo.toml
│  └─ src-ui/
│     ├─ src/
│     │  └─ lib.rs
│     └─ Cargo.toml
└─ Cargo.toml

Tauriバックエンドを作成する

Tauriバックエンドを作っていきます。

Cargo.toml

./apps/src-tauri/Cargo.tomlを以下の内容に更新します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/Cargo.toml

tauri-buildtauriのfeaturesにconfig-tomlを指定しています。これは後述のTauri設定ファイルをTOML形式のTauri.tomlで書くためです。Cargo.tomlTrunk.tomlにあわせました。

Tauri.toml

Tauri設定ファイルTauri.tomlを以下の内容で新規作成します。上で更新したCargo.tomlと同じディレクトリに配置します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/Tauri.toml

[build]の項目で、後で作成するLeptosフロントエンドのディレクトリ(./apps/src-ui)を指すように指定するのがポイントです。また、フロントエンドが今回のようにRustのときは、app.with-global-tauritrueにします。

Rustソースファイル

Rustソースファイルを用意します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/build.rs

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/src/main.rs

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/src/lib.rs

許可リスト

Tauri v2から許可リストの指定方法が変わりました。

https://tauri.app/reference/acl/capability/

./apps/src-tauricapabilitiesディレクトリを作り、default.jsonファイルを以下の内容で新規作成します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-tauri/capabilities/default.json

Leptosフロントエンドを作成する

Leptosフロントエンドを作っていきます。

Cargo.toml

./apps/src-ui/Cargo.tomlを以下の内容に更新します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/Cargo.toml

LeptosをTauriから呼び出すために、leptosのfeaturesにcsrを指定します。

Trunk.toml

Trunk設定ファイルTrunk.tomlを以下の内容で新規作成します。src-uiディレクトリに配置します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/Trunk.toml

index.html

デスクトップアプリの起点となるHTMLファイルを新規作成します。src-uiディレクトリに配置します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/index.html

.taurignore

TauriアプリをCargo tauri devコマンドで起動したとき、ファイルを監視して、変更があったらリビルトします。ただし、Leptosフロントエンド側のみの変更であれば、Tauriバックエンドはリビルドする必要がありません。この設定をするために、src-uiディレクトリに.taurignoreファイルを作成します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/.taurignore

Rustソースファイル

Rustソースファイルを用意します。

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/src/main.rs

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/src/lib.rs

https://github.com/daizutabi/tauri-leptos-example/blob/0.1/apps/src-ui/src/app.rs

プロジェクトを実行する

TrunkとTauri CLIをインストールします。

> cargo install trunk --locked
> cargo install tauri-cli --version "^2.0.0" --locked

https://trunkrs.dev/

https://tauri.app/reference/cli/

ターゲットアーキテクチャを追加します。

> rustup target add wasm32-unknown-unknown

プロジェクトをビルドして実行します。

> cargo tauri dev

hello-world

無事、最初のデスクトップアプリが完成しました。

サンプルコード

今回作成したプロジェクトは以下からダウンロード可能です。

https://github.com/daizutabi/tauri-leptos-example/tree/0.1

GitHubで編集を提案

Discussion