この記事は夏のブログリレー23日目の記事です。
こんにちは、21B SysAd班のmehm8128です。
今回はTauriを初めて使ってみたので、そのレポートです。
Tauriとは
Tauriとは、Rustを用いてデスクトップアプリケーションを作成できるフレームワークらしいです(モバイルアプリケーションもv2.0でサポート予定)。僕は今までWebアプリしか触っていなかったのですが、Rustで何か作りたくなって今回Tauriを触ってみることにしました。
今回のソースコードはここにあります。
開発の流れ
pnpm create tauri-app
でいくつかの質問に答えたらプロジェクトが作成されます。
今回はフロントエンドはReactで作りました。
src
ディレクトリ内がReactのプロジェクト、src-tauri
内がRustのプロジェクトになっています。
フロントエンド→バックエンドへの通信は
import { invoke } from "@tauri-apps/api/tauri"
を用いて
invoke(Rustの関数名, パラメーター)
のような形で発火すると、リクエストを送信できます。
例えばタスクの作成は
invoke("create_task", { newTask })
と書いています。これに対応するRustのコードは
#[tauri::command]
fn create_task(new_task: TaskSeed) -> Result<Task, String> {
となっていて、create_task
という関数名がinvoke
の第一引数と一致、new_task
という引数名がinvoke
の第二引数のnewTask
というプロパティ名と一致しています(第一引数はどちらもスネークケース、第二引数はRustがスネークケースでTSがキャメルケースなことに注意)。
このようにしてlist_tasks
とtoggle_task
も実装しています。
また、今回はSQLiteを使ってローカルにデータを保存しています。
ビルド
今のところ手元でクロスコンパイルすることは難しいらしく、LinuxではLinux用ビルド、WindowsではWindows用ビルドをするような形になります。
僕は普段WSL2を利用しているので、Windows用ビルドをするためにソースコードをWindows側に移動させてビルドしました。Windows側にNode.jsは入れてあったのですが、Rustは入れてなかったのでRustをインストールするところから始まりました(ただし、インストーラー1つで入れられるので簡単に終わりました)。
完成品
こんな感じです。Windowsでビルドしたものを動かしてます。
詰まりポイント
エラーハンドリング
#[tauri::command]
をつけた関数で、Result型でanyhowのエラーを返そうとすると謎のエラーに遭遇しました。
対処法としてはドキュメントに書いてあるように、String
に変換して返すか、独自のエラー型を作成するといいらしいのですが、今回は手軽そうな前者を選びました。
起動してすぐ再起動してしまう
開発環境でSQLiteを使っていると、Info File src-tauri/db.sqlite3 changed. Rebuilding application...
というログが出てすぐ再起動してしまいます。
--no-watch
をつけてdevを起動するとひとまず解決しました。
.tauriignore
を使うと直るみたいなのも出てきたのですが、僕の場合上手くいきませんでした。
まとめ
todolistということでほんの一部の機能しか使えていないので、今後もうちょっと面白いものを作って色々と使っていけたらなと思います。
明日の担当はzoi_dayoくんです、お楽しみにー