從 Tauri 1.0 升級
本指南將引導您將 Tauri 1.0 應用程式升級到 Tauri 2.0。
準備行動裝置
Tauri 的行動裝置介面要求您的專案輸出一個共享函式庫。如果您現有的應用程式目標是行動裝置,您必須變更您的 crate 以產生該類型的產出物,以及桌面執行檔。
- 變更 Cargo manifest 以產生函式庫。附加以下區塊
[lib]name = "app_lib"crate-type = ["staticlib", "cdylib", "rlib"]
-
將
src-tauri/src/main.rs
重新命名為src-tauri/src/lib.rs
。此檔案將由桌面和行動裝置目標共用。 -
將
lib.rs
中的main
函數標頭重新命名為以下內容
#[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() { // your code here}
tauri::mobile_entry_point
macro 準備您的函數以在行動裝置上執行。
- 重新建立呼叫共享執行函數的
main.rs
檔案
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() { app_lib::run();}
自動化遷移
Tauri v2 CLI 包含一個 migrate
指令,可以自動化大部分的程序,並協助您完成遷移
npm install @tauri-apps/cli@latestnpm run tauri migrate
yarn upgrade @tauri-apps/cli@latestyarn tauri migrate
pnpm update @tauri-apps/cli@latestpnpm tauri migrate
cargo install tauri-cli --version "^2.0.0" --lockedcargo tauri migrate
在 命令列介面參考 中了解更多關於 migrate
指令的資訊
變更摘要
以下是從 Tauri 1.0 到 Tauri 2.0 的變更摘要
Tauri 設定
package > productName
和package > version
已移動到頂層物件。- 二進制檔案名稱不再自動重新命名以符合
productName
,因此您必須在頂層物件中新增一個符合productName
的mainBinaryName
字串。 package
已移除。tauri
鍵已重新命名為app
。tauri > allowlist
已移除。請參閱 遷移權限。tauri > allowlist > protocol > assetScope
已移動到app > security > assetProtocol > scope
。tauri > cli
已移動到plugins > cli
。tauri > windows > fileDropEnabled
已重新命名為app > windows > dragDropEnabled
。tauri > updater > active
已移除。tauri > updater > dialog
已移除。tauri > updater
已移動到plugins > updater
。- 新增了
bundle > createUpdaterArtifacts
,使用應用程式更新器時必須設定。- 從已經發布的 v1 應用程式升級時,請將其設定為
v1Compatible
。請參閱 更新器指南 以取得更多資訊。
- 從已經發布的 v1 應用程式升級時,請將其設定為
tauri > systemTray
已重新命名為app > trayIcon
。tauri > pattern
已移動到app > security > pattern
。tauri > bundle
已移動到頂層。tauri > bundle > identifier
已移動到頂層物件。tauri > bundle > dmg
已移動到bundle > macOS > dmg
tauri > bundle > deb
已移動到bundle > linux > deb
tauri > bundle > appimage
已移動到bundle > linux > appimage
tauri > bundle > macOS > license
已移除,請改用bundle > licenseFile
。tauri > bundle > windows > wix > license
已移除,請改用bundle > licenseFile
。tauri > bundle > windows > nsis > license
已移除,請改用bundle > licenseFile
。tauri > bundle > windows > webviewFixedRuntimePath
已移除,請改用bundle > windows > webviewInstallMode
。build > withGlobalTauri
已移動到app > withGlobalTauri
。build > distDir
已重新命名為frontendDist
。build > devPath
已重新命名為devUrl
。
新的 Cargo 功能
- linux-protocol-body:啟用自訂協定請求 body 解析,允許 IPC 使用它。需要 webkit2gtk 2.40。
移除的 Cargo 功能
- reqwest-client:reqwest 現在是唯一支援的用戶端。
- reqwest-native-tls-vendored:請改用
native-tls-vendored
。 - process-command-api:請改用
shell
外掛程式 (請參閱以下章節中的說明)。 - shell-open-api:請改用
shell
外掛程式 (請參閱以下章節中的說明)。 - windows7-compat:已移動到
notification
外掛程式。 - updater:Updater 現在是一個外掛程式。
- linux-protocol-headers:由於我們升級了最低 webkit2gtk 版本,因此現在預設啟用。
- system-tray:已重新命名為
tray-icon
。
Rust Crate 變更
api
模組已移除。每個 API 模組都可以在 Tauri 外掛程式中找到。api::dialog
模組已移除。請改用tauri-plugin-dialog
。 遷移api::file
模組已移除。請改用 Rust 的std::fs
。api::http
模組已移除。請改用tauri-plugin-http
。 遷移api::ip
模組已重寫並移動到tauri::ipc
。請查看新的 API,特別是tauri::ipc::Channel
。api::path
模組函數和tauri::PathResolved
已移動到tauri::Manager::path
。 遷移api::process::Command
、tauri::api::shell
和tauri::Manager::shell_scope
API 已移除。請改用tauri-plugin-shell
。 遷移api::process::current_binary
和tauri::api::process::restart
已移動到tauri::process
。api::version
模組已移除。請改用 semver crate。App::clipboard_manager
和AppHandle::clipboard_manager
已移除。請改用tauri-plugin-clipboard
。 遷移App::get_cli_matches
已移除。請改用tauri-plugin-cli
。 遷移App::global_shortcut_manager
和AppHandle::global_shortcut_manager
已移除。請改用tauri-plugin-global-shortcut
。 遷移Manager::fs_scope
已移除。檔案系統作用域可以透過tauri_plugin_fs::FsExt
存取。Plugin::PluginApi
現在接收外掛程式設定作為第二個參數。Plugin::setup_with_config
已移除。請改用更新後的tauri::Plugin::PluginApi
。scope::ipc::RemoteDomainAccessScope::enable_tauri_api
和scope::ipc::RemoteDomainAccessScope::enables_tauri_api
已移除。請改為透過scope::ipc::RemoteDomainAccessScope::add_plugin
個別啟用每個核心外掛程式。scope::IpcScope
已移除,請改用scope::ipc::Scope
。scope::FsScope
、scope::GlobPattern
和scope::FsScopeEvent
已移除,請分別使用scope::fs::Scope
、scope::fs::Pattern
和scope::fs::Event
。updater
模組已移除。請改用tauri-plugin-updater
。 遷移Env.args
欄位已移除,請改用Env.args_os
欄位。Menu
、MenuEvent
、CustomMenuItem
、Submenu
、WindowMenuEvent
、MenuItem
和Builder::on_menu_event
API 已移除。 遷移SystemTray
、SystemTrayHandle
、SystemTrayMenu
、SystemTrayMenuItemHandle
、SystemTraySubmenu
、MenuEntry
和SystemTrayMenuItem
API 已移除。 遷移
JavaScript API 變更
@tauri-apps/api
套件不再提供非核心模組。只有先前的 tauri
(現在是 core
)、path
、event
和 window
模組被匯出。所有其他模組都已移至外掛程式。
@tauri-apps/api/tauri
模組已重新命名為@tauri-apps/api/core
。 遷移@tauri-apps/api/cli
模組已移除。請改用@tauri-apps/plugin-cli
。 遷移@tauri-apps/api/clipboard
模組已移除。請改用@tauri-apps/plugin-clipboard
。 遷移@tauri-apps/api/dialog
模組已移除。請改用@tauri-apps/plugin-dialog
。 遷移@tauri-apps/api/fs
模組已移除。請改用@tauri-apps/plugin-fs
。 遷移@tauri-apps/api/global-shortcut
模組已移除。請改用@tauri-apps/plugin-global-shortcut
。 遷移@tauri-apps/api/http
模組已移除。請改用@tauri-apps/plugin-http
。 遷移@tauri-apps/api/os
模組已移除。請改用@tauri-apps/plugin-os
。 遷移@tauri-apps/api/notification
模組已移除。請改用@tauri-apps/plugin-notification
。 遷移@tauri-apps/api/process
模組已移除。請改用@tauri-apps/plugin-process
。 遷移@tauri-apps/api/shell
模組已移除。請改用@tauri-apps/plugin-shell
。 遷移@tauri-apps/api/updater
模組已移除。請改用@tauri-apps/plugin-updater
遷移@tauri-apps/api/window
模組已重新命名為@tauri-apps/api/webviewWindow
。 遷移
v1 外掛程式現在以 @tauri-apps/plugin-<plugin-name>
發布。先前它們可從 git 以 tauri-plugin-<plugin-name>-api
取得。
環境變數變更
大部分由 Tauri CLI 讀取和寫入的環境變數都已重新命名,以保持一致性並防止錯誤
TAURI_PRIVATE_KEY
->TAURI_SIGNING_PRIVATE_KEY
TAURI_KEY_PASSWORD
->TAURI_SIGNING_PRIVATE_KEY_PASSWORD
TAURI_SKIP_DEVSERVER_CHECK
->TAURI_CLI_NO_DEV_SERVER_WAIT
TAURI_DEV_SERVER_PORT
->TAURI_CLI_PORT
TAURI_PATH_DEPTH
->TAURI_CLI_CONFIG_DEPTH
TAURI_FIPS_COMPLIANT
->TAURI_BUNDLER_WIX_FIPS_COMPLIANT
TAURI_DEV_WATCHER_IGNORE_FILE
->TAURI_CLI_WATCHER_IGNORE_FILENAME
TAURI_TRAY
->TAURI_LINUX_AYATANA_APPINDICATOR
TAURI_APPLE_DEVELOPMENT_TEAM
->APPLE_DEVELOPMENT_TEAM
TAURI_PLATFORM
->TAURI_ENV_PLATFORM
TAURI_ARCH
->TAURI_ENV_ARCH
TAURI_FAMILY
->TAURI_ENV_FAMILY
TAURI_PLATFORM_VERSION
->TAURI_ENV_PLATFORM_VERSION
TAURI_PLATFORM_TYPE
->TAURI_ENV_PLATFORM_TYPE
TAURI_DEBUG
->TAURI_ENV_DEBUG
事件系統
事件系統經過重新設計,使其更易於使用。現在它有一個更簡單的實作,依賴事件目標,而不是依賴事件的來源。
emit
函數現在會將事件發送到所有事件監聽器。- 新增了一個新的
emit_to
/emitTo
函數,以觸發特定目標的事件。 emit_filter
現在根據EventTarget
而不是視窗進行篩選。- 將
listen_global
重新命名為listen_any
。它現在監聽所有事件,無論其篩選器和目標為何。 - JavaScript:
event.listen()
的行為類似於listen_any
。它現在監聽所有事件,無論其篩選器和目標為何,除非在Options
中設定了目標。 - JavaScript:
WebviewWindow.listen
等僅監聽發送到各自EventTarget
的事件。
多 Webview 支援
Tauri v2 引入了多 Webview 支援,目前在 unstable
功能標誌後面。為了支援它,我們將 Rust Window
類型重新命名為 WebviewWindow
,並將 Manager get_window
函數重新命名為 get_webview_window
。
WebviewWindow
JS API 類型現在從 @tauri-apps/api/webviewWindow
而不是 @tauri-apps/api/window
重新匯出。
Windows 上的新 origin URL
在 Windows 上,生產環境應用程式中的前端檔案現在託管在 http://tauri.localhost
而不是 https://tauri.localhost
。因此,除非在 v1 中使用了 dangerousUseHttpScheme
,否則 IndexedDB、LocalStorage 和 Cookies 將會重設。為了防止這種情況,您可以將 app > windows > useHttpsScheme
設定為 true
,或使用 WebviewWindowBuilder::use_https_scheme
以繼續使用 https
協定。
詳細遷移步驟
將您的 Tauri 1.0 應用程式遷移到 Tauri 2.0 時,您可能會遇到的常見情境。
遷移到 Core 模組
@tauri-apps/api/tauri
模組已重新命名為 @tauri-apps/api/core
。只需重新命名模組匯入即可
import { invoke } from "@tauri-apps/api/tauri"import { invoke } from "@tauri-apps/api/core"
遷移到 CLI 外掛程式
Rust App::get_cli_matches
JavaScript @tauri-apps/api/cli
API 已移除。請改用 @tauri-apps/plugin-cli
外掛程式
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-cli = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_cli::init())}
{ "dependencies": { "@tauri-apps/plugin-cli": "^2.0.0" }}
import { getMatches } from '@tauri-apps/plugin-cli';const matches = await getMatches();
fn main() { use tauri_plugin_cli::CliExt; tauri::Builder::default() .plugin(tauri_plugin_cli::init()) .setup(|app| { let cli_matches = app.cli().matches()?; Ok(()) })}
遷移到 Clipboard 外掛程式
Rust App::clipboard_manager
和 AppHandle::clipboard_manager
以及 JavaScript @tauri-apps/api/clipboard
API 已移除。請改用 @tauri-apps/plugin-clipboard-manager
外掛程式
[dependencies]tauri-plugin-clipboard-manager = "2"
fn main() { tauri::Builder::default() .plugin(tauri_plugin_clipboard_manager::init())}
{ "dependencies": { "@tauri-apps/plugin-clipboard-manager": "^2.0.0" }}
import { writeText, readText } from '@tauri-apps/plugin-clipboard-manager';await writeText('Tauri is awesome!');assert(await readText(), 'Tauri is awesome!');
use tauri_plugin_clipboard::{ClipboardExt, ClipKind};tauri::Builder::default() .plugin(tauri_plugin_clipboard::init()) .setup(|app| { app.clipboard().write(ClipKind::PlainText { label: None, text: "Tauri is awesome!".into(), })?; Ok(()) })
遷移到 Dialog 外掛程式
Rust tauri::api::dialog
JavaScript @tauri-apps/api/dialog
API 已移除。請改用 @tauri-apps/plugin-dialog
外掛程式
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-dialog = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_dialog::init())}
{ "dependencies": { "@tauri-apps/plugin-dialog": "^2.0.0" }}
import { save } from '@tauri-apps/plugin-dialog';const filePath = await save({ filters: [ { name: 'Image', extensions: ['png', 'jpeg'], }, ],});
use tauri_plugin_dialog::DialogExt;tauri::Builder::default() .plugin(tauri_plugin_dialog::init()) .setup(|app| { app.dialog().file().pick_file(|file_path| { // do something with the optional file path here // the file path is `None` if the user closed the dialog });
app.dialog().message("Tauri is Awesome!").show(); Ok(()) })
遷移到 File System 外掛程式
Rust App::get_cli_matches
JavaScript @tauri-apps/api/fs
API 已移除。請改用 std::fs
(用於 Rust) 和 @tauri-apps/plugin-fs
外掛程式 (用於 JavaScript)
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-fs = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_fs::init())}
{ "dependencies": { "@tauri-apps/plugin-fs": "^2.0.0" }}
import { mkdir, BaseDirectory } from '@tauri-apps/plugin-fs';await mkdir('db', { baseDir: BaseDirectory.AppLocalData });
某些函數和類型已被重新命名或移除
Dir
列舉別名已移除,請使用BaseDirectory
。FileEntry
、FsBinaryFileOption
、FsDirOptions
、FsOptions
、FsTextFileOption
和BinaryFileContents
介面和類型別名已被移除,並替換為適用於每個函式的新介面。createDir
已重新命名為mkdir
。readBinaryFile
已重新命名為readFile
。removeDir
已移除,並替換為remove
。removeFile
已移除,並替換為remove
。renameFile
已移除,並替換為rename
。writeBinaryFile
已重新命名為writeFile
。
使用 Rust std::fs
函式。
遷移到 Global Shortcut 外掛程式
Rust 的 App::global_shortcut_manager
和 AppHandle::global_shortcut_manager
以及 JavaScript 的 @tauri-apps/api/global-shortcut
API 已移除。請改用 @tauri-apps/plugin-global-shortcut
外掛程式。
- 新增至 cargo 依賴項
[dependencies][target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies]tauri-plugin-global-shortcut = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_global_shortcut::Builder::default().build())}
{ "dependencies": { "@tauri-apps/plugin-global-shortcut": "^2.0.0" }}
import { register } from '@tauri-apps/plugin-global-shortcut';await register('CommandOrControl+Shift+C', () => { console.log('Shortcut triggered');});
use tauri_plugin_global_shortcut::GlobalShortcutExt;
tauri::Builder::default() .plugin( tauri_plugin_global_shortcut::Builder::new().with_handler(|app, shortcut| { println!("Shortcut triggered: {:?}", shortcut); }) .build(), ) .setup(|app| { // register a global shortcut // on macOS, the Cmd key is used // on Windows and Linux, the Ctrl key is used app.global_shortcut().register("CmdOrCtrl+Y")?; Ok(()) })
遷移到 HTTP 外掛程式
Rust 的 tauri::api::http
JavaScript @tauri-apps/api/http
API 已移除。請改用 @tauri-apps/plugin-http
外掛程式。
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-http = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_http::init())}
{ "dependencies": { "@tauri-apps/plugin-http": "^2.0.0" }}
import { fetch } from '@tauri-apps/plugin-http';const response = await fetch( 'https://raw.githubusercontent.com/tauri-apps/tauri/dev/package.json');
use tauri_plugin_http::reqwest;
tauri::Builder::default() .plugin(tauri_plugin_http::init()) .setup(|app| { let response_data = tauri::async_runtime::block_on(async { let response = reqwest::get( "https://raw.githubusercontent.com/tauri-apps/tauri/dev/package.json", ) .await .unwrap(); response.text().await })?; Ok(()) })
HTTP 外掛程式重新匯出 reqwest,因此您可以查閱其文件以獲取更多資訊。
遷移到 Notification 外掛程式
Rust 的 tauri::api::notification
JavaScript @tauri-apps/api/notification
API 已移除。請改用 @tauri-apps/plugin-notification
外掛程式。
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-notification = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_notification::init())}
{ "dependencies": { "@tauri-apps/plugin-notification": "^2.0.0" }}
import { sendNotification } from '@tauri-apps/plugin-notification';sendNotification('Tauri is awesome!');
use tauri_plugin_notification::NotificationExt;use tauri::plugin::PermissionState;
fn main() { tauri::Builder::default() .plugin(tauri_plugin_notification::init()) .setup(|app| { if app.notification().permission_state()? == PermissionState::Unknown { app.notification().request_permission()?; } if app.notification().permission_state()? == PermissionState::Granted { app.notification() .builder() .body("Tauri is awesome!") .show()?; } Ok(()) })}
遷移到 Menu 模組
Rust 的 Menu
API 已移動到 tauri::menu
模組,並重構為使用 muda crate。
使用 tauri::menu::MenuBuilder
使用 tauri::menu::MenuBuilder
而非 tauri::Menu
。請注意,它的建構子需要一個 Manager 實例 (App
、AppHandle
或 WebviewWindow
其中之一) 作為引數。
use tauri::menu::MenuBuilder;
tauri::Builder::default() .setup(|app| { let menu = MenuBuilder::new(app) .copy() .paste() .separator() .undo() .redo() .text("open-url", "Open URL") .check("toggle", "Toggle") .icon("show-app", "Show App", app.default_window_icon().cloned().unwrap()) .build()?; Ok(()) })
使用 tauri::menu::PredefinedMenuItem
使用 tauri::menu::PredefinedMenuItem
而非 tauri::MenuItem
use tauri::menu::{MenuBuilder, PredefinedMenuItem};
tauri::Builder::default() .setup(|app| { let menu = MenuBuilder::new(app).item(&PredefinedMenuItem::copy(app)?).build()?; Ok(()) })
使用 tauri::menu::MenuItemBuilder
使用 tauri::menu::MenuItemBuilder
而非 tauri::CustomMenuItem
use tauri::menu::MenuItemBuilder;
tauri::Builder::default() .setup(|app| { let toggle = MenuItemBuilder::new("Toggle").accelerator("Ctrl+Shift+T").build(app)?; Ok(()) })
使用 tauri::menu::SubmenuBuilder
使用 tauri::menu::SubmenuBuilder
而非 tauri::Submenu
use tauri::menu::{MenuBuilder, SubmenuBuilder};
tauri::Builder::default() .setup(|app| { let submenu = SubmenuBuilder::new(app, "Sub") .text("Tauri") .separator() .check("Is Awesome") .build()?; let menu = MenuBuilder::new(app).item(&submenu).build()?; Ok(()) })
tauri::Builder::menu
現在需要一個閉包,因為選單需要 Manager 實例才能建構。請參閱 文件 以獲取更多資訊。
選單事件
Rust 的 tauri::Builder::on_menu_event
API 已移除。請改用 tauri::App::on_menu_event
或 tauri::AppHandle::on_menu_event
。
use tauri::menu::{CheckMenuItemBuilder, MenuBuilder, MenuItemBuilder};
tauri::Builder::default() .setup(|app| { let toggle = MenuItemBuilder::with_id("toggle", "Toggle").build(app)?; let check = CheckMenuItemBuilder::new("Mark").build(app)?; let menu = MenuBuilder::new(app).items(&[&toggle, &check]).build()?;
app.set_menu(menu)?;
app.on_menu_event(move |app, event| { if event.id() == check.id() { println!("`check` triggered, do something! is checked? {}", check.is_checked().unwrap()); } else if event.id() == "toggle" { println!("toggle triggered!"); } }); Ok(()) })
請注意,有兩種方法可以檢查選取了哪個選單項目:將項目移動到事件處理閉包並比較 ID,或透過 with_id
建構子為項目定義自訂 ID,並使用該 ID 字串進行比較。
遷移到 OS 外掛程式
Rust 的 tauri::api::os
JavaScript @tauri-apps/api/os
API 已移除。請改用 @tauri-apps/plugin-os
外掛程式。
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-os = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_os::init())}
{ "dependencies": { "@tauri-apps/plugin-os": "^2.0.0" }}
import { arch } from '@tauri-apps/plugin-os';const architecture = await arch();
fn main() { tauri::Builder::default() .plugin(tauri_plugin_os::init()) .setup(|app| { let os_arch = tauri_plugin_os::arch(); Ok(()) })}
遷移到 Process 外掛程式
Rust 的 tauri::api::process
JavaScript @tauri-apps/api/process
API 已移除。請改用 @tauri-apps/plugin-process
外掛程式。
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-process = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_process::init())}
{ "dependencies": { "@tauri-apps/plugin-process": "^2.0.0" }}
import { exit, relaunch } from '@tauri-apps/plugin-process';await exit(0);await relaunch();
fn main() { tauri::Builder::default() .plugin(tauri_plugin_process::init()) .setup(|app| { // exit the app with a status code app.handle().exit(1); // restart the app app.handle().restart(); Ok(()) })}
遷移到 Shell 外掛程式
Rust 的 tauri::api::shell
JavaScript @tauri-apps/api/shell
API 已移除。請改用 @tauri-apps/plugin-shell
外掛程式。
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-shell = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init())}
{ "dependencies": { "@tauri-apps/plugin-shell": "^2.0.0" }}
import { Command, open } from '@tauri-apps/plugin-shell';const output = await Command.create('echo', 'message').execute();
await open('https://github.com/tauri-apps/tauri');
- 開啟 URL
use tauri_plugin_shell::ShellExt;
fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) .setup(|app| { app.shell().open("https://github.com/tauri-apps/tauri", None)?; Ok(()) })}
- 產生子程序並檢索狀態碼
use tauri_plugin_shell::ShellExt;
fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) .setup(|app| { let status = tauri::async_runtime::block_on(async move { app.shell().command("which").args(["ls"]).status().await.unwrap() }); println!("`which` finished with status: {:?}", status.code()); Ok(()) })}
- 產生子程序並捕獲其輸出
use tauri_plugin_shell::ShellExt;
fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) .setup(|app| { let output = tauri::async_runtime::block_on(async move { app.shell().command("echo").args(["TAURI"]).output().await.unwrap() }); assert!(output.status.success()); assert_eq!(String::from_utf8(output.stdout).unwrap(), "TAURI"); Ok(()) })}
- 產生子程序並非同步讀取其事件
use tauri_plugin_shell::{ShellExt, process::CommandEvent};
fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) .setup(|app| { let handle = app.handle().clone(); tauri::async_runtime::spawn(async move { let (mut rx, mut child) = handle.shell().command("cargo") .args(["tauri", "dev"]) .spawn() .expect("Failed to spawn cargo");
let mut i = 0; while let Some(event) = rx.recv().await { if let CommandEvent::Stdout(line) = event { println!("got: {}", String::from_utf8(line).unwrap()); i += 1; if i == 4 { child.write("message from Rust\n".as_bytes()).unwrap(); i = 0; } } } }); Ok(()) })}
遷移到 Tray Icon 模組
Rust 的 SystemTray
API 已重新命名為 TrayIcon
以保持一致性。新的 API 可以在 Rust tray
模組中找到。
使用 tauri::tray::TrayIconBuilder
使用 tauri::tray::TrayIconBuilder
而非 tauri::SystemTray
let tray = tauri::tray::TrayIconBuilder::with_id("my-tray").build(app)?;
請參閱 TrayIconBuilder 以獲取更多資訊。
遷移至選單
使用 tauri::menu::Menu
而非 tauri::SystemTrayMenu
、tauri::menu::Submenu
而非 tauri::SystemTraySubmenu
和 tauri::menu::PredefinedMenuItem
而非 tauri::SystemTrayMenuItem
。
托盤事件
tauri::SystemTray::on_event
已拆分為 tauri::tray::TrayIconBuilder::on_menu_event
和 tauri::tray::TrayIconBuilder::on_tray_icon_event
use tauri::{ menu::{MenuBuilder, MenuItemBuilder}, tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},};
tauri::Builder::default() .setup(|app| { let toggle = MenuItemBuilder::with_id("toggle", "Toggle").build(app)?; let menu = MenuBuilder::new(app).items(&[&toggle]).build()?; let tray = TrayIconBuilder::new() .menu(&menu) .on_menu_event(move |app, event| match event.id().as_ref() { "toggle" => { println!("toggle clicked"); } _ => (), }) .on_tray_icon_event(|tray, event| { if let TrayIconEvent::Click { button: MouseButton::Left, button_state: MouseButtonState::Up, .. } = event { let app = tray.app_handle(); if let Some(webview_window) = app.get_webview_window("main") { let _ = webview_window.show(); let _ = webview_window.set_focus(); } } }) .build(app)?;
Ok(()) })
遷移到 Updater 外掛程式
Rust 的 tauri::updater
和 JavaScript 的 @tauri-apps/api-updater
API 已移除。若要使用 @tauri-apps/plugin-updater
設定自訂更新目標
- 新增至 cargo 依賴項
[dependencies]tauri-plugin-updater = "2"
- 在 JavaScript 或 Rust 專案中使用
fn main() { tauri::Builder::default() .plugin(tauri_plugin_updater::Builder::new().build())}
{ "dependencies": { "@tauri-apps/plugin-updater": "^2.0.0" }}
import { check } from '@tauri-apps/plugin-updater';import { relaunch } from '@tauri-apps/plugin-process';
const update = await check();if (update?.available) { console.log(`Update to ${update.version} available! Date: ${update.date}`); console.log(`Release notes: ${update.body}`); await update.downloadAndInstall(); // requires the `process` plugin await relaunch();}
檢查更新
use tauri_plugin_updater::UpdaterExt;
fn main() { tauri::Builder::default() .plugin(tauri_plugin_updater::Builder::new().build()) .setup(|app| { let handle = app.handle(); tauri::async_runtime::spawn(async move { let response = handle.updater().check().await; }); Ok(()) })}
設定自訂更新目標
fn main() { let mut updater = tauri_plugin_updater::Builder::new(); #[cfg(target_os = "macos")] { updater = updater.target("darwin-universal"); } tauri::Builder::default() .plugin(updater.build())}
將路徑遷移到 Tauri Manager
Rust 的 tauri::api::path
模組函式和 tauri::PathResolver
已移動到 tauri::Manager::path
use tauri::{path::BaseDirectory, Manager};
tauri::Builder::default() .setup(|app| { let home_dir_path = app.path().home_dir().expect("failed to get home dir");
let path = app.path().resolve("path/to/something", BaseDirectory::Config)?;
Ok(()) })
遷移到新的 Window API
在 Rust 端,Window
已重新命名為 WebviewWindow
,其建構器 WindowBuilder
現在命名為 WebviewWindowBuilder
,而 WindowUrl
現在命名為 WebviewUrl
。
此外,Manager::get_window
函式已重新命名為 get_webview_window
,而視窗的 parent_window
API 已重新命名為 parent_raw
以支援高階視窗父 API。
在 JavaScript 端,WebviewWindow
類別現在於 @tauri-apps/api/webviewWindow
路徑中匯出。
onMenuClicked
函式已移除,您可以在 JavaScript 中建立選單時攔截選單事件。
遷移嵌入的額外檔案 (Resources)
在 JavaScript 端,請確保您 遷移至檔案系統外掛程式。此外,請注意在 遷移權限 中對 v1 允許清單所做的變更。
在 Rust 端,請確保您 將路徑遷移至 Tauri Manager。
遷移嵌入的外部二進制檔案 (Sidecar)
在 Tauri v1 中,外部二進制檔案及其引數在允許清單中定義。在 v2 中,請使用新的權限系統。閱讀 遷移權限 以獲取更多資訊。
在 JavaScript 端,請確保您 遷移至 Shell 外掛程式。
在 Rust 端,tauri::api::process
API 已移除。請改用 tauri_plugin_shell::ShellExt
和 tauri_plugin_shell::process::CommandEvent
API。閱讀 嵌入外部二進制檔案 指南以了解方法。
v2 中已移除 “process-command-api” 功能標誌。因此,執行外部二進制檔案不再需要在 Tauri 設定中定義此功能。
遷移權限
v1 允許清單已重寫為全新的權限系統,該系統適用於個別外掛程式,並且對於多視窗和遠端 URL 支援更具可配置性。此新系統的工作方式類似於存取控制列表 (ACL),您可以在其中允許或拒絕命令、將權限分配給一組特定的視窗和網域,以及定義存取範圍。
若要為您的應用程式啟用權限,您必須在 src-tauri/capabilities
資料夾內建立功能檔案,Tauri 將自動為您配置所有其他內容。
migrate
CLI 命令會自動剖析您的 v1 允許清單並產生關聯的功能檔案。
若要了解有關權限和功能的更多資訊,請參閱 安全性文件。
© 2025 Tauri 貢獻者。CC-BY / MIT