Tauri 開発メモ

開発環境のインストール

cargo install tauri-cli
  • ところが、下記のようなエラーが出る。(2024年3月現在)
   Compiling common-path v1.0.0
error[E0599]: no method named `to_str` found for struct `log::kv::Value` in the current scope
   --> C:\Users\lipoy\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tauri-cli-1.5.10\src\lib.rs:132:29
    |
132 |         let action = action.to_str().unwrap();
    |                             ^^^^^^ help: there is a method with a similar name: `to_cow_str`
  • オプションに --locked を付けるとインストールに成功した。
cargo install tauri-cli --locked
  • 次に下記のコマンドを実行する。(プロジェクトのひな型を生成するツールのインストール)
cargo install create-tauri-app --locked

プロジェクトの作成

  • 下記のコマンドで「hello」という名前のプロジェクトを新規作成する。
cargo create-tauri-app hello
  • このとき、言語とUIテンプレートを選択できる。
✔ Choose which language to use for your frontend · Rust - (cargo)
✔ Choose your UI template · Vanilla
  • 言語は、Rust か TypeScript / JavaScript のいずれか
  • パッケージ管理は
    • 言語が Rust の場合は、Cargo である。
    • 言語が TypeScript / JavaScript の場合は、pnpm, yarn, npm, bun から選択できる。
  • UIテンプレートは
    • 言語が Rust の場合は、Vanilla (素のJavaScript), Yew, Leptos, Sycamore から選択できる。
    • 言語が TypeScript / JavaScript の場合は、Vanilla (素のJavaScript), Vue, Svelte, React, Solid, Angular, Preact から選択できる。
  • 対話式でなくオプションで指定することもできる。詳しくは --help オプションで。
cargo create-tauri-app -m cargo -t vanilla hello3

プロジェクトのビルドと実行

  • デバッグビルドは、プロジェクトのディレクトリに入って下記のコマンドを実行する。ビルドが成功したら自動的にアプリが実行される。
cargo tauri dev
  • リリースビルドのためには src-tauri/tauri.conf.json の「identifier」が一意な値でなければならない。
  • リリースビルドには下記のコマンドを実行する。リリースビルドではアプリは実行されない。
cargo tauri build
  • src-tauri/target/release に実行ファイル hello.exe ができる。
  • src-tauri/target/release/bundle/msiインストーラ hello_0.0.0_x64_en-US.msi ができる。

プロジェクトのファイル構成

Rust / Vanilla の場合、プロジェクトの主なファイルは下図のような構成になる。

hello
┣src/              【Webページ】
┃┣index.html          HTML
┃┣styles.css          CSS
┃┣main.js             JavaScript
┃┗assets/             画像ファイルなど
┃
┗src-tauri/        【Rustプロジェクト】
 ┣src/
 ┃┗main.rs           Rustのソース
 ┃
 ┣Cargo.toml          Rustプロジェクトの設定
 ┣tauri.conf.json     Tauriの設定
 ┣icons/              アイコン
 ┃
 ┗target/             ビルド出力先
  ┣debug/
  ┗release/

VSCodeでのデバッグについて

  • 拡張機能 rust-analyzer, CodeLLDB をインストールしておく。
  • 拡張機能 Tauri をインストールすると、コマンドパレットからもビルドなどができるので、お好みで。
  • VSCodeでプロジェクトのフォルダを開く。
  • [View]→[Terminal]で出るターミナルからコマンドを実行できる。
  • デバッガを利用するには下記のような .vscode/launch.json を作成する。
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Tauri Development Debug",
      "cargo": {
        "args": [
          "build",
          "--manifest-path=./src-tauri/Cargo.toml",
          "--no-default-features"
        ]
      },
      // task for the `beforeDevCommand` if used, must be configured in `.vscode/tasks.json`
      //"preLaunchTask": "ui:dev"
    },
    {
      "type": "lldb",
      "request": "launch",
      "name": "Tauri Production Debug",
      "cargo": {
        "args": ["build", "--release", "--manifest-path=./src-tauri/Cargo.toml"]
      },
      // task for the `beforeBuildCommand` if used, must be configured in `.vscode/tasks.json`
      //"preLaunchTask": "ui:build"
    }
  ]
}

デバッグコンソール出力について

  • バックエンドの Rust の println!() の出力はターミナルに出る。
  • フロントエンドの JavaScript の console.log() の出力は、アプリの画面右クリック→「開発ツールで調査する」で開く開発ツールのウィンドウのコンソールに出る。

tauri.conf.json について

例えば、Windowsでウィンドウのサイズを固定にしたい場合、tauri.conf.json の "windows" を以下のように設定する。

    "windows": [
      {
        "title": "アプリのタイトル",
        "width": 800,
        "height": 600,
        "resizable": false
      }
    ],

styles.css について

例えば、ウィンドウのスクロールバーを無効にしたい場合、styles.css で以下のように設定する。

body {
  overflow: hidden; /* スクロールバー無効 */
}

関数の引数名についての注意

  • Rust 側の関数の引数名がスネークケースの場合、JavaScript側ではキャメルケースに変換されてしまう。
  • つまり、Rustの関数が fn greet(invoke_message: String) の場合、
    JavaScriptでは invoke("greet", { invokeMessage:"Hoge" }) のように呼び出さないといけない。
  • JavaScript側のアノテーションで #[tauri::command(rename_all = "snake_case")] とすればスネークケースのままになる。

参考:Tauri を使ってみる: 引数と返り値

参考