Actualizar desde Tauri 1.0
Esta guía te guiará a través de la actualización de tu aplicación Tauri 1.0 a Tauri 2.0.
Preparándose para móvil
La interfaz móvil de Tauri requiere que tu proyecto produzca una biblioteca compartida. Si estás apuntando a móviles para tu aplicación existente, debes cambiar tu crate para producir ese tipo de artefacto junto con el ejecutable de escritorio.
- Modifica el manifiesto Cargo para producir la biblioteca. Añade el siguiente bloque:
[lib]name = "app_lib"crate-type = ["staticlib", "cdylib", "rlib"]-
Cambia el nombre de
src-tauri/src/main.rsasrc-tauri/src/lib.rs. Este archivo será compartido tanto por los targets de escritorio como por los móviles. -
Cambia el nombre de la cabecera de la función
mainenlib.rspor el siguiente:
#[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() { // tu código aquí}El macro tauri::mobile_entry_point prepara tu función para ser ejecutada en el móvil.
- Vuelve a crear el archivo
main.rsllamando a la función de ejecución compartida:
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() { app_lib::run();}Migración Automatizada
La CLI de Tauri v2 incluye un comando migrate que automatiza la mayor parte del proceso y te ayuda a finalizar la migración:
npm install @tauri-apps/cli@latestnpm run tauri migrateyarn upgrade @tauri-apps/cli@latestyarn tauri migratepnpm update @tauri-apps/cli@latestpnpm tauri migratecargo install tauri-cli --version "^2.0.0" --lockedcargo tauri migratePara saber más sobre el comando migrate, consulta la Referencia de la interfaz de línea de comandos
Resumen de los cambios
A continuación se resumen los cambios de Tauri 1.0 a Tauri 2.0:
Configuración de Tauri
- Los campos
package > productNameypackage > versionse han trasladado al campo de nivel superior. packageeliminado.- La clave
tauriha pasado a serapp. tauri > allowlisteliminado. Véase Migrar permisos.tauri > allowlist > protocol > assetScopemovido aapp > security > assetProtocol > scope.tauri > climovido aplugins > cli.tauri > windows > fileDropEnabledrenombrado aapp > windows > dragDropEnabled.tauri > updater > activeeliminado.tauri > updater > dialogeliminado.tauri > updatermovido aplugins > updater.tauri > systemTrayrenombrado aapp > trayIcon.tauri > patternmovido aapp > security > pattern.tauri > bundlemovido a nivel superior.tauri > bundle > dmgmovido abundle > macOS > dmgtauri > bundle > debmovido abundle > linux > debtauri > bundle > appimagemovido abundle > linux > appimagetauri > bundle > macOS > licenseeliminado, utilizabundle > licenseFileen su lugar.tauri > bundle > windows > wix > licenseeliminado, utilizabundle > licenseFileen su lugar.tauri > bundle > windows > nsis > licenseeliminado, utilizabundle > licenseFileen su lugar.build > withGlobalTaurimovido aapp > withGlobalTauri.build > distDirrenombrado afrontendDist.build > devPathrenombrado adevUrl.
Referencia de la API de configuración de Tauri 2.0
Nuevas características de Cargo
- linux-protocol-body: Habilita el análisis personalizado del cuerpo de solicitud del protocolo, permitiendo que el IPC lo utilice. Requiere webkit2gtk 2.40.
Características de Cargo eliminadas
- reqwest-client: reqwest es ahora el único cliente soportado.
- reqwest-native-tls-vendored: utiliza
native-tls-vendoreden su lugar. - process-command-api: utiliza el plugin
shellen su lugar. (véanse las instrucciones en la sección siguiente). - shell-open-api: utiliza el plugin
shellen su lugar. (véanse las instrucciones en la sección siguiente). - windows7-compat: movido al plugin
notification. - updater: Updater es ahora un plugin.
- linux-protocol-headers: Ahora habilitado por defecto desde que actualizamos nuestra versión mínima de webkit2gtk.
- system-tray: renombrado a
tray-icon.
Cambios en el Crate de Rust
- El módulo
apiha sido eliminado. Cada módulo de API se puede encontrar en un plugin de Tauri. - El módulo
api::dialogha sido eliminado. Utilizatauri-plugin-dialogen su lugar. Migración - El módulo
api::fileha sido eliminado. Utilizastd::fsde Rust en su lugar. - El módulo
api::httpha sido eliminado. Utilizatauri-plugin-httpen su lugar. Migración - El módulo
api::ipha sido reescrito y movido atauri::ipc. Revisa las nuevas APIs, especialmentetauri::ipc::Channel. - Las funciones del módulo
api::pathytauri::PathResolvedse han movido atauri::Manager::path. Migración - Las APIs
api::process::Command,tauri::api::shellytauri::Manager::shell_scopehan sido eliminadas. Utilizatauri-plugin-shellen su lugar. Migración - Las funciones
api::process::current_binaryytauri::api::process::restartse han movido atauri::process. - El módulo
api::versionha sido eliminado. Utiliza el crate semver en su lugar. - Los métodos
App::clipboard_manageryAppHandle::clipboard_managerhan sido eliminados. Utilizatauri-plugin-clipboarden su lugar. Migración - El método
App::get_cli_matchesha sido eliminado. Utilizatauri-plugin-clien su lugar. Migración - Los métodos
App::global_shortcut_manageryAppHandle::global_shortcut_managerhan sido eliminados. Utilizatauri-plugin-global-shortcuten su lugar. Migración - El método
Manager::fs_scopeha sido eliminado. El alcance del sistema de archivos puede ser accedido a través detauri_plugin_fs::FsExt. - Ahora,
Plugin::PluginApirecibe una configuración de plugin como segundo argumento. - El método
Plugin::setup_with_configha sido eliminado. Utiliza el actualizadotauri::Plugin::PluginApien su lugar. - Los métodos
scope::ipc::RemoteDomainAccessScope::enable_tauri_apiyscope::ipc::RemoteDomainAccessScope::enables_tauri_apihan sido eliminados. Habilita cada plugin del núcleo individualmente mediantescope::ipc::RemoteDomainAccessScope::add_pluginen su lugar. - El módulo
scope::IpcScopeha sido eliminado, utilizascope::ipc::Scopeen su lugar. - El módulo
scope::IpcScopeha sido eliminado, utilizascope::ipc::Scopeen su lugar. - Los módulos
scope::FsScope,scope::GlobPatternyscope::FsScopeEventhan sido eliminados, utilizascope::fs::Scope,scope::fs::Patternyscope::fs::Eventrespectivamente. - El módulo
updaterha sido eliminado. Utilizatauri-plugin-updateren su lugar. Migración - El campo
Env.argsha sido eliminado, utiliza el campoEnv.args_osen su lugar. - Las APIs
Menu,MenuEvent,CustomMenuItem,Submenu,WindowMenuEvent,MenuItemyBuilder::on_menu_eventhan sido eliminadas. Migración - Las APIs
SystemTray,SystemTrayHandle,SystemTrayMenu,SystemTrayMenuItemHandle,SystemTraySubmenu,MenuEntryySystemTrayMenuItemhan sido eliminadas. Migración
Cambios en la API de JavaScript
El paquete @tauri-apps/api ya no proporciona módulos no centrales. Sólo se exportan los anteriores módulos tauri (ahora core), path, event y window. Todos los demás se han trasladado a plugins.
- El módulo
@tauri-apps/api/tauriha sido renombrado a@tauri-apps/api/core. Migración - El módulo
@tauri-apps/api/cliha sido eliminado. Utiliza@tauri-apps/plugin-clien su lugar. Migración - El módulo
@tauri-apps/api/clipboardha sido eliminado. Utiliza@tauri-apps/plugin-clipboarden su lugar. Migración - El módulo
@tauri-apps/api/dialogha sido eliminado. Utiliza@tauri-apps/plugin-dialogen su lugar. Migración - El módulo
@tauri-apps/api/fsha sido eliminado. Utiliza@tauri-apps/plugin-fsen su lugar. Migración - El módulo
@tauri-apps/api/global-shortcutha sido eliminado. Utiliza@tauri-apps/plugin-global-shortcuten su lugar. Migración - El módulo
@tauri-apps/api/httpha sido eliminado. Utiliza@tauri-apps/plugin-httpen su lugar. Migración - El módulo
@tauri-apps/api/osha sido eliminado. Utiliza@tauri-apps/plugin-osen su lugar. Migración - El módulo
@tauri-apps/api/notificationha sido eliminado. Utiliza@tauri-apps/plugin-notificationen su lugar. Migración - El módulo
@tauri-apps/api/processha sido eliminado. Utiliza@tauri-apps/plugin-processen su lugar. Migración - El módulo
@tauri-apps/api/shellha sido eliminado. Utiliza@tauri-apps/plugin-shellen su lugar. Migración - El módulo
@tauri-apps/api/updaterha sido eliminado. Utiliza@tauri-apps/plugin-updateren su lugar. Migración - El módulo
@tauri-apps/api/windowha sido renombrado a@tauri-apps/api/webviewWindow. Migración
Cambios en las variables de entorno
La mayoría de las variables de entorno leídas y escritas por el CLI de Tauri fueron renombradas por consistencia y prevención de errores:
TAURI_PRIVATE_KEY->TAURI_SIGNING_PRIVATE_KEYTAURI_KEY_PASSWORD->TAURI_SIGNING_PRIVATE_KEY_PASSWORDTAURI_SKIP_DEVSERVER_CHECK->TAURI_CLI_NO_DEV_SERVER_WAITTAURI_DEV_SERVER_PORT->TAURI_CLI_PORTTAURI_PATH_DEPTH->TAURI_CLI_CONFIG_DEPTHTAURI_FIPS_COMPLIANT->TAURI_BUNDLER_WIX_FIPS_COMPLIANTTAURI_DEV_WATCHER_IGNORE_FILE->TAURI_CLI_WATCHER_IGNORE_FILENAMETAURI_TRAY->TAURI_LINUX_AYATANA_APPINDICATORTAURI_APPLE_DEVELOPMENT_TEAM->APPLE_DEVELOPMENT_TEAMTAURI_PLATFORM->TAURI_ENV_PLATFORMTAURI_ARCH->TAURI_ENV_ARCHTAURI_FAMILY->TAURI_ENV_FAMILYTAURI_PLATFORM_VERSION->TAURI_ENV_PLATFORM_VERSIONTAURI_PLATFORM_TYPE->TAURI_ENV_PLATFORM_TYPETAURI_DEBUG->TAURI_ENV_DEBUG
Sistema de eventos
El sistema de eventos fue rediseñado para ser más fácil de usar. En lugar de depender de la fuente del evento, ahora tiene una implementación más simple que se basa en los objetivos del evento.
- La función
emitahora emite el evento a todos los escuchadores de eventos. - Se agregó una nueva función
emit_topara desencadenar un evento a un objetivo específico. emit_filterahora filtra en función deEventTargeten lugar de una ventana.- Se renombró
listen_globalalisten_any. Ahora escucha todos los eventos independientemente de sus filtros y objetivos.
Soporte Multiwebview
Tauri v2 introduce soporte multiwebview actualmente detrás de una bandera de característica unstable.
Para admitirlo, renombramos el tipo de ventana Rust Window a WebviewWindow y la función get_window del Manager a get_webview_window.
El tipo de API JS WebviewWindow ahora se reexporta desde @tauri-apps/api/webviewWindow en lugar de @tauri-apps/api/window.
Pasos Detallados de Migración
Escenarios comunes que puedes encontrar al migrar tu aplicación de Tauri 1.0 a Tauri 2.0.
Migrar al Módulo Core
El módulo @tauri-apps/api/tauri fue renombrado a @tauri-apps/api/core.
Simplemente renombra la importación del módulo:
import { invoke } from "@tauri-apps/api/tauri"import { invoke } from "@tauri-apps/api/core"Migrar al plugin CLI
Las APIs de Rust App::get_cli_matches y JavaScript @tauri-apps/api/cli han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-cli:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-cli = "2"- Úsalo en un proyecto con JavaScript o 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(()) })}Migrar al Plugin de Portapapeles
Las APIs de Rust App::clipboard_manager,AppHandle::clipboard_manager y la API JavaScript @tauri-apps/api/clipboard han sido eliminadas. En su lugar, utiliza el plugin @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(()) })Migrar al Plugin de diálogo
Las APIs de Rust tauri::api::dialog y JavaScript @tauri-apps/api/dialog han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-dialog:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-dialog = "2"- Úsalo en un proyecto con JavaScript o 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| { // haz algo con la ruta opcional del archivo // la ruta del archivo es `None` si el usuario cerró el diálogo });
app.dialog().message("Tauri is Awesome!").show(); Ok(()) })Migrar al Plugin del Sistema de Archivos
Las APIs de Rust App::get_cli_matches y JavaScript @tauri-apps/api/fs han sido eliminadas. En su lugar, utiliza std::fs para Rust y el plugin @tauri-apps/plugin-fs para JavaScript:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-fs = "2"- Úsalo en un proyecto con JavaScript o 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 });Algunas funciones y tipos han sido renombrados o eliminados:
- Se eliminó el alias
Dirpara el enum, utilizaBaseDirectory. - Las interfaces y alias de tipo
FileEntry,FsBinaryFileOption,FsDirOptions,FsOptions,FsTextFileOptionyBinaryFileContentshan sido eliminados y reemplazados con nuevas interfaces adecuadas para cada función. createDirfue renombrado amkdir.readBinaryFilefue renombrado areadFile.removeDirfue eliminado y reemplazado conremove.removeFilefue eliminado y reemplazado conremove.renameFilefue eliminado y reemplazado conrename.writeBinaryFilefue renombrado awriteFile.
Utiliza las funciones de Rust std::fs.
Migrar al Plugin de Atajos Globales
Las APIs de Rust App::global_shortcut_manager y AppHandle::global_shortcut_manager, y JavaScript @tauri-apps/api/global-shortcut han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-global-shortcut:
- Agrega a las dependencias de Cargo:
[dependencies][target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies]tauri-plugin-global-shortcut = "2"- Úsalo en un proyecto con JavaScript o 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| { // registrar un atajo global // en macOS, se usa la tecla Cmd // en Windows y Linux, se usa la tecla Ctrl app.global_shortcut().register("CmdOrCtrl+Y")?; Ok(()) })Migrar al Plugin HTTP
Las APIs de Rust tauri::api::http y JavaScript @tauri-apps/api/http han sido eliminadas. Utiliza el plugin @tauri-apps/plugin-http en su lugar:
- Agrega las dependencias a Cargo:
[dependencies]tauri-plugin-http = "2"- Úsalo en un proyecto con JavaScript o 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(()) })El plugin HTTP reexporta reqwest para que puedas consultar su documentación para obtener más información.
Migrar al Plugin de Notificaciones
Las APIs de Rust tauri::api::notification y JavaScript @tauri-apps/api/notification han sido eliminadas. Utiliza el plugin @tauri-apps/plugin-notification en su lugar:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-notification = "2"- Úsalo en proyectos con JavaScript o 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(()) })}Migrar al Módulo de Menú
Las APIs de Rust Menu fueron movidas al módulo tauri::menu y refactorizadas para utilizar el muda crate.
Usa tauri::menu::MenuBuilder
Utiliza tauri::menu::MenuBuilder en lugar de tauri::Menu. Ten en cuenta que su constructor toma una instancia de Manager (uno de App, AppHandle o WebviewWindow) como argumento:
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(()) })Usa tauri::menu::PredefinedMenuItem
Utiliza tauri::menu::PredefinedMenuItem en lugar de tauri::MenuItem:
use tauri::menu::{MenuBuilder, PredefinedMenuItem};
tauri::Builder::default() .setup(|app| { let menu = MenuBuilder::new(app).item(&PredefinedMenuItem::copy(app)?).build()?; Ok(()) })Utiliza tauri::menu::MenuItemBuilder
Utiliza tauri::menu::MenuItemBuilder en lugar de tauri::CustomMenuItem:
use tauri::menu::MenuItemBuilder;
tauri::Builder::default() .setup(|app| { let toggle = MenuItemBuilder::new("Toggle").accelerator("Ctrl+Shift+T").build(app)?; Ok(()) })Utiliza tauri::menu::SubmenuBuilder
Utiliza tauri::menu::SubmenuBuilder en lugar de 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 ahora toma un cierre porque el menú necesita una instancia de Manager para ser construido. Consulta la documentación para obtener más información.
Eventos de Menú
La API tauri::Builder::on_menu_event de Rust fue eliminada. En su lugar, usa tauri::App::on_menu_event o 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(()) })Ten en cuenta que hay dos formas de verificar qué elemento del menú fue seleccionado: mover el elemento al cierre del controlador de eventos y comparar los identificadores, o definir un identificador personalizado para el elemento a través del constructor with_id y usar esa cadena de identificación para comparar.
Migrar al Plugin OS
Las APIs tauri::api::os de Rust y @tauri-apps/api/os de JavaScript han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-os:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-os = "2"- Usa en el proyecto JavaScript o 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(()) })}Migrar al Plugin Process
Las APIs tauri::api::process de Rust y @tauri-apps/api/process de JavaScript han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-process:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-process = "2"- Úsalo en proyectos con JavaScript o 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(()) })}Migrar al Plugin Shell
Las APIs tauri::api::shell de Rust y @tauri-apps/api/shell de JavaScript han sido eliminadas. Utiliza en su lugar el plugin @tauri-apps/plugin-shell:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-shell = "2"- Úsalo en un proyecto con JavaScript o 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');- Abrir una 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(()) })}- Generar un proceso hijo y obtener el código de estado
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(()) })}- Crear un proceso hijo y capturar su salida
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(()) })}- Crea un proceso hijo y lee sus eventos de forma asíncrona:
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(()) })}Migrar al Módulo de Tray Icon
Las APIs SystemTray de Rust fueron renombradas a TrayIcon para mayor consistencia. Las nuevas APIs pueden encontrarse en el módulo tray de Rust.
Usa tauri::tray::TrayIconBuilder
Utiliza tauri::tray::TrayIconBuilder en lugar de tauri::SystemTray:
let tray = tauri::tray::TrayIconBuilder::with_id("mi-bandeja").build(app)?;Consulta TrayIconBuilder para más información.
Migrar a Menú
Utiliza tauri::menu::Menu en lugar de tauri::SystemTrayMenu, tauri::menu::Submenu en lugar de tauri::SystemTraySubmenu, y tauri::menu::PredefinedMenuItem en lugar de tauri::SystemTrayMenuItem. Migración
Eventos de Bandeja
tauri::SystemTray::on_event ha sido dividido en tauri::tray::TrayIconBuilder::on_menu_event y tauri::tray::TrayIconBuilder::on_tray_icon_event:
use tauri::{ menu::{MenuBuilder, MenuItemBuilder}, tray::{ClickType, TrayIconBuilder},};
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 event.click_type == ClickType::Left { 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(()) })Migrar al Plugin de Actualizaciones
El diálogo incorporado con una verificación de actualización automática ha sido eliminado. En su lugar, utiliza las APIs de Rust y JS para verificar e instalar actualizaciones.
Las APIs tauri::updater de Rust y @tauri-apps/api-updater de JavaScript han sido eliminadas. Para establecer un objetivo de actualización personalizado con @tauri-apps/plugin-updater:
- Agrega a las dependencias de Cargo:
[dependencies]tauri-plugin-updater = "2"- Úsalo en un proyecto con JavaScript o 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();}Para comprobar actualizaciones:
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(()) })}Para establecer un objetivo de actualización personalizado:
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())}Migrar de Path a Tauri Manager
Las funciones del módulo tauri::api::path de Rust y tauri::PathResolver se han trasladado a 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(()) })Migrar a la nueva API de Ventanas
En el lado de Rust, Window fue renombrado a WebviewWindow y su constructor WindowBuilder ahora se llama WebviewWindowBuilder.
Además, la función Manager::get_window fue renombrada a get_webview_window y
la API parent_window de la ventana fue renombrada a parent_raw para admitir una API de ventana principal de alto nivel.
En el lado de JavaScript, la clase WebviewWindow ahora se exporta en la ruta @tauri-apps/api/webviewWindow.
La función onMenuClicked fue eliminada, ahora puedes interceptar eventos de menú al crear un menú en JavaScript en su lugar.
Migrar de Binarios Externos Incrustados (Sidecar)
En Tauri v1, los binarios externos y sus argumentos se definían en la lista blanca. En la v2, utiliza el nuevo sistema de permisos. Lee Migración de Permisos para más información.
En el lado de JavaScript, asegúrate de Migrar al Plugin Shell.
En el lado de Rust, la API tauri::api::process ha sido eliminada. Usa tauri_plugin_shell::ShellExt y las APIs tauri_plugin_shell::process::CommandEvent en su lugar. Lee la guía de Incrustar Binarios Externos para ver cómo.
El indicador de características “process-command-api” ha sido eliminado en la v2. Por lo tanto, ejecutar los binarios externos ya no requiere que esta característica esté definida en la configuración de Tauri.
Migrar Permisos
La lista blanca v1 ha sido reescrita a un sistema completamente nuevo para permisos que funciona para plugins individuales y es mucho más configurable para soportar múltiples ventanas y URL remotas. Este nuevo sistema funciona como una lista de control de acceso (ACL) donde puedes permitir o denegar comandos, asignar permisos a un conjunto específico de ventanas y dominios, y definir alcances de acceso.
Para habilitar permisos para tu aplicación, debes crear archivos de capacidades dentro de la carpeta src-tauri/capabilities, y Tauri configurará automáticamente todo lo demás para ti.
El comando migrate de la CLI analiza automáticamente tu lista blanca v1 y genera el archivo de capacidad asociado.
Para obtener más información sobre permisos y capacidades, consulta la documentación.
© 2024 Tauri Contributors. CC-BY / MIT