从 Tauri 1.0 升级
本指南将向您展示如何将您的Tauri 1.0应用程序升级到Tauri 2.0。
为移动设备做准备
Tauri的移动界面要求您的项目输出一个共享库。如果您现有应用程序的目标是移动设备,您必须更改您的框架以生成这种类型的工件,同时包含桌面可执行文件。
- 更改Cargo清单以生成库。追加以下块
[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
宏使您的函数准备好在移动设备上执行。
- 重新创建
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: 启用自定义协议请求体解析,允许 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: 更新程序现在是一个插件。
- linux-protocol-headers: 由于我们已经升级了我们的最小 webkit2gtk 版本,现在默认启用。
- system-tray: 已更名为
tray-icon
。
Rust框架变更
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_SERVER_PORT
->TAURI_CLI_PORT
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
函数,用于触发特定目标的事件。 emit_filter
现在基于EventTarget
而不是窗口进行过滤。
多个webview支持
重命名了 listen_global
为 listen_any
。现在它将监听所有事件,无论它们的过滤器或目标。
Tauri v2 引入了多webview支持,目前此功能处于 不稳定
状态。为了支持它,我们将 Rust 中的 Window
类型重命名为 WebviewWindow
,并将 Manager 中的 get_window
函数重命名为 get_webview_window
。
在Windows上使用新的源URL
WebviewWindow
JS API 类型现在从 @tauri-apps/api/webviewWindow
重新导出,而不是从 @tauri-apps/api/window
。
详细迁移步骤
当您将 Tauri 1.0 应用程序迁移到 Tauri 2.0 时可能会遇到的常见场景。
迁移到核心模块
@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(()) })}
迁移到剪贴板插件
已移除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(()) })
迁移到对话框插件
已移除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(()) })
迁移到文件系统插件
已移除Rust App::get_cli_matches
和 JavaScript @tauri-apps/api/fs
API。请使用Rust的 std::fs
和JavaScript的 @tauri-apps/plugin-fs
插件代替。
- 添加到 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
函数。
迁移到全局快捷键插件
已移除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,您可以查阅其文档以获取更多信息。
迁移到通知插件
已移除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(()) })}
迁移到菜单模块
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(()) })}
迁移到进程插件
已移除 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(()) })}
迁移到托盘图标模块
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(()) })
迁移到更新器插件
已移除带自动更新检查的内置对话框,请使用 Rust 和 JS API 来检查和安装更新。
已移除 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管理器
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(()) })
迁移到新的窗口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 中创建菜单时拦截菜单事件。
迁移嵌入的额外文件(资源)
在 JavaScript 方面,请确保您已 迁移到文件系统插件。此外,请注意在 迁移权限 中所做的更改。
在 Rust 方面,请确保您已 迁移路径到 Tauri Manager。
迁移嵌入的外部二进制文件(侧车)
在 Tauri v1 中,外部二进制文件及其参数在 allowlist 中定义。在 v2 中,请使用新的权限系统。更多信息请见 迁移权限。
在 JavaScript 方面,请确保您已 迁移到 Shell 插件。
在 Rust 方面,tauri::api::process
API 已移除。请使用 tauri_plugin_shell::ShellExt
和 tauri_plugin_shell::process::CommandEvent
API。更多信息请参考 从 Rust 运行外部二进制文件 指南。
在 v2 版本中,“process-command-api”功能标志已被移除。因此,运行外部二进制文件不再需要在 Tauri 配置中定义此功能。
迁移权限
在 v1 版本中,许可列表已被重写为一个完全新的权限管理系统,适用于单个插件,并且在多窗口和远程 URL 支持方面的配置性大大增强。这个新系统类似于访问控制列表(ACL),您可以允许或拒绝命令,将权限分配给特定的窗口和域集合,并定义访问范围。
为了启用您的应用程序的权限,您必须在 src-tauri/capabilities
文件夹中创建能力文件,Tauri 将为您自动配置其他一切。
CLI 命令 migrate
会自动解析您的 v1 许可列表,并生成相关的能力文件。
要了解更多关于权限和能力的信息,请参阅安全文档。
© 2025 Tauri 贡献者。CC-BY / MIT