Fedistarのtauriをv2にアップデートした

migration guideは

v2.tauri.app

の通り. 先にやっとくこととしては,Cargo.tomlをlibに変更しておいて

[lib]
name = "app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]

今までmain.rsだったものをlib.rsに変更して

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    // your code here
}

main.rsを新設してlibの関数を呼ぶように変更しておく.

#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

fn main() {
  app_lib::run();
}

残りのコード変換はauto migration commandが用意されている.

$ npm run tauri migrate

Fedistarで,自動的にmigrateされたのはこの辺.

github.com

JS側とtauriの基本的な設定はこれでmigrateできる.ただし,rust側のコードを厚くしていると,これはあんまりmigrateされていなかったので,書いておく.

Rust側で対応が必要なこと

パッケージ構造の変更

まず,パッケージの変更がかなり行われている.例えば,今まで tauri::MenuItem だったものが tauri::menu::MenuItem になっていたり.こういうパッケージの変更はJS側もかなり起こっているが,なぜだがJS側はauto migrationされており,Rust側だけ残っていた.

ここは地道にRust Docを漁ってパッケージを追いかけるしかない.一応大きなものはCrate Changesに書いてある.

Upgrade from Tauri 1.0 | Tauri

AppHandleが参照に変わった

これはかなり影響範囲がでかかった. 通常,

tauri::Builder::default().setup(|app| {
  let app_handle = app.handle();
})
.run(tauri::generate_context!())

みたいなコードを書いていると思うが,このhandle が返すものが AppHandleから&AppHandleに変更になった.これをもともとArcなんかくるんでいると,盛大にコンパイルエラーがでるので修正する必要がある. 幸いこいつはCloneトレイトを持っているのでcloneしてしまっても問題ない.

tauri::api::pathが消えた

もともと

let user_dir = tauri::api::path::data_dir();

こういうのを,setup前に呼び出してディレクトリにconfigを保存したりしていたんだけど,このパッケージ自体が消えた.

MigrationGuideによると

tauri::Builder::default().setup(|app| {
  let user_dir = app.path().data_dir();
})

というようにsetup内に閉じ込める必要がある.これは結構きつかった. data_dirなんてstaticにしてもいいくらいなのに,setupに閉じ込められるとなると,クロージャー内で参照したりするときに結構困る.まぁpathなのでcloneしても何ら問題ないといえばないのだが.

on_menu_eventがAppのメソッドになった

tauri::Builder::default()
  .on_menu_event(|event| {
  })
  .setup(|app| {
  })

これが

tauri::Builder::default().setup(|app| {
  app.on_menu_event(|app, event| {})
})

になった.

これはまず,MenuBuilderというものができた.

let menu = MenuBuilder::new(app_handle).build()?;
let submenu = SubmenuBuilder::new(app_handle, "File").quit().build()?;
menu.append(&submenu);

みたいな感じになる. tauri側で用意されているメニューもあるので,そういうのは .quit()とか .minimize() とかで追加していって,最後に build()してやれば良い.

これはまぁ慣れればそんなに違和感はない.

emit_allがemitになった

単純.今まで

app_handle.emit_all("event", obj);

していたものが,

app_handle.emit("event", obj);

になる.emitで特に指定なくallに呼び出しがかかるようになった.逆に特定のwindowに贈りたいときは emit_toを使う.

JS側の修正はゼロでいけた

auto migrationのみでそのまま動いた.パッケージ変更のみでメソッドの変更はそんなになかったのかね.

また,tauri.conf.jsonも結構変わっている.のだがこれももちろんauto migrationされるので,特に変更する必要はなくなった.allowListを更新するときはcapabilitiesに追加するのを忘れないようにしたい.

Rust側はコンパイルエラーを解消すれば動くので,結構楽にいけた.