RustのGUIフレームワーク Tauri でデスクトップアプリ開発を始める

Rust で作られたGUIフレームワークで、デスクトップアプリ開発を始めるまでの手順と、
Tauri の簡単な設定内容を記録しておきます。

開発環境は Windows で、Rustのバージョンは以下で実施してます。

```bat
> cargo -V
cargo 1.65.0 (4bc8f24d3 2022-10-20)

> rustc -V
rustc 1.65.0 (897e37553 2022-11-02)
```

Tauri はクロスプラットフォーム対応なので、Linux向け、Mac向けもできます。
最近は Tauri Mobile で Android, iOS 向けのアプリも作れるようになったみたいです。
https://tauri.app/blog/2022/12/09/tauri-mobile-alpha/

## Tauri をインストールする

cargo から簡単にインストールできます。
https://github.com/tauri-apps/create-tauri-app

```bat
> cargo install create-tauri-app
> cargo create-tauri-app
```
![tauri1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428227/13804c98-38c9-0491-e724-62a4bb718c17.png)



## パッケージマネージャを選ぶ

```cargo create-tauri-app``` すると、パッケージマネージャの選択を促されます。
![tauri2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428227/ab1dc4c1-8517-db20-28ed-bbe429c4f09f.png)
Cargoが速いし慣れてるのでCargoを選びたいところですが、Cargoにすると UI Template の選択が Vanilla か Yew の二択になります。
Vanilla でいい人は Cargo にするといいと思います。
ExtJS とかをフロントで読み込んで使う場合は Vanilla がやり易いと思います。

React、Vue や Svelte を使いたい場合は、パッケージマネージャは yarn か npm を選ぶといいです。
npm はちょっと重たいので、今回は yarn を使ってみます。
![tauri4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428227/e95f0ef5-3881-9350-9461-e8d05673ce8f.png)
色々出てきました。
せっかくだからおれは Svelte をえらぶぜ！

## Tauri をビルドする

パッケージマネージャの構築が終わると、続いて入力するコマンドが表示されます。
![tauri5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428227/6c0ef614-505b-ac47-4235-5d8148d8da8a.png)
選ぶとコマンドを実行しろと言われます。
言われたとおりに入力していきます。

```bat
> cd tauri-app
> yarn
> yarn tauri dev
```

最後のコマンドでビルドが走ります。結構長いです。
ビルドが終わるとアプリの画面が表示されます。
![tauri6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428227/36cdce11-bc51-397a-0a6f-535fb1fd75e6.png)

後は選んだ UI Template に沿って画面を作っていくことになります。

## Tauri の設定について

Tauri のアプリケーションとしての設定は、src-tauri/tauri.config.json で管理できます。

### アプリのウィンドウサイズを変える

tauri.config.json の windows プロパティで設定できます。width, height とそのままのプロパティがあります。
https://tauri.app/v1/api/config/#windowconfig

こんな感じで書きます。
```json
    "windows": [
      {
        "fullscreen": false,
        "height": 620,
        "minHeight": 400, 
        "resizable": true,
        "width": 800,
        "minWidth": 580
      }
    ]
```

### アイコンを変更する

src-tauri/icons にそれぞれのサイズのアイコンを置くと、ビルドするときに読み込んでくれます。
tauri.config.json にも bundle.icon 以下に設定があります。

Tauri にはアイコン作成のコマンドも用意されています。
png で作った画像ファイルを ico 形式かつサイズ毎に変換してくれます。

```bat
> cargo tauri icon .\icon.png -o .\icons\
```

-o は出力先のオプションです。出力したファイルを src-tauri/icons にコピーすればアイコンを変更できます。

### ローカルファイルにアクセスする

コンテンツセキュリティポリシー（CSP）を設定します。
security プロパティに以下を追加すればアクセスできるようになります。
```json
    "security": {
      "csp": "default-src 'self'; img-src 'self' asset: https://asset.localhost"
    },
```

### WebViewプロセスからのコマンド実行を許可する

レンダラプロセスからOSコマンドを実行する場合、shell プロパティに実行するコマンドを明示する必要があります。
https://tauri.app/v1/api/js/shell/

```json
      "shell": {
        "all": true,
        "execute": true,
        "sidecar": true,
        "open": true,
        "scope": [{
          "name": "taskkill",
          "cmd": "taskkill",
          "args": true
        }, {
          "name": "dir",
          "cmd": "dir",
          "args": true
        }]
      }
```

使えるコマンドを許可したら、レンダラプロセスからコールします。

```javascript
import { Command } from '@tauri-apps/api/shell';
let cmd = new Command('taskkill', ["/im", "hogehoge.exe", "/f"]);
let process = await cmd.spawn();
```

### その他

コアプロセスからコマンドを実行するサンプルも書きたかったのですが、残念なことにやり方を失念しました…。
確認できたら追記しようと思います。

使い方は概ね Tauri の公式ガイドに大体書いてくれてますが、検索は少し探しにくいです。
https://tauri.app/v1/guides/

### プロジェクトサンプル

Tauri でDMM版ウマ娘のイベントチェッカー＆育成ログ保存を行う Windows アプリケーションを作成しています。
とっかかりの参考にはなると思いますので、URL書いておきます。

https://github.com/sou1ka/umaumalogger

Vanilla JS で作る場合はこちらが参考になると思います。

https://github.com/sou1ka/slideshow

https://github.com/sou1ka/hwinfo_gadget


## 参考

https://qiita.com/hyaguchi947d/items/77f41571126c8cb9d326

https://gihyo.jp/article/2022/10/rust-monthly-topics-02

https://zenn.dev/dekunobo/articles/rust_tauri_icon