migration guideは
の通り. 先にやっとくこととしては,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されたのはこの辺.
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| {}) })
になった.
Menu生成の方法がだいぶ変わった
これはまず,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側はコンパイルエラーを解消すれば動くので,結構楽にいけた.