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.
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();}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
A continuación se resumen los cambios de Tauri 1.0 a Tauri 2.0:
- Los campos
package > productNameypackage > versionse han trasladado al campo de nivel superior. - el nombre del binario ya no se renombra automáticamente para coincidir con
productName, por lo que debes agregar una stringmainBinaryNameen el objeto de nivel superior que coincida conproductName. 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.- Se ha agragado
bundle > createUpdaterArtifacts, debe ser configurado al usar el actualizador de la aplicación.- configúralo a
v1Compatiblecuando actualices desde aplicaciones de la V1 que ya habían sido distribuidas. Consulta la guía del actualizador para más información.
- configúralo a
tauri > systemTrayrenombrado aapp > trayIcon.tauri > patternmovido aapp > security > pattern.tauri > bundlemovido a nivel superior.tauri > bundle > identifiermovido a objeto del 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.tauri > bundle > windows > webviewFixedRuntimePatheliminado, utilizabundle > windows > webviewInstallModeen su lugar.build > withGlobalTaurimovido aapp > withGlobalTauri.build > distDirrenombrado afrontendDist.build > devPathrenombrado adevUrl.
Referencia de la API de configuración de Tauri 2.0
- linux-protocol-body: Habilita el análisis personalizado del cuerpo de solicitud del protocolo, permitiendo que el IPC lo utilice. Requiere webkit2gtk 2.40.
- 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.
- 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. - 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
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
Los plugins the la V1 ahora están publicados como @tauri-apps/plugin-<plugin-name>. Anteriormente, estaban disponibles desde git como tauri-plugin-<plugin-name>-api.
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
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.
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.
On Windows the frontend files in production apps are now hosted on http://tauri.localhost instead of https://tauri.localhost. Because of this IndexedDB, LocalStorage and Cookies will be reset unless dangerousUseHttpScheme was used in v1. To prevent this you can set app > windows > useHttpsScheme to true or use WebviewWindowBuilder::use_https_scheme to keep using the https scheme.
Escenarios comunes que puedes encontrar al migrar tu aplicación de Tauri 1.0 a Tauri 2.0.
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"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(()) })}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(()) })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(()) })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.
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(()) })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 así que puedes consultar su documentación para obtener más información.
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(()) })}Las APIs de Rust Menu fueron movidas al módulo tauri::menu y refactorizadas para utilizar el muda crate.
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(()) })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 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 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.
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.
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(()) })}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(()) })}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(()) })}Las APIs SystemTray de Rust fueron renombradas a TrayIcon para mayor consistencia. Las nuevas APIs pueden encontrarse en el módulo tray de Rust.
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.
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.
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::{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.unminimize(); let _ = webview_window.show(); let _ = webview_window.set_focus(); } } }) .build(app)?;
Ok(()) })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( `¡Actualización a ${update.version} disponible! Fecha: ${update.date}` ); console.log(`Notas del parche: ${update.body}`); await update.downloadAndInstall(); // requiere el plugin `process` 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())}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("no se pudo obtener el directorio home");
let path = app.path().resolve("path/haz/algo", BaseDirectory::Config)?;
Ok(()) })En el lado de Rust, Window fue renombrado a WebviewWindow, su constructor WindowBuilder ahora se llama WebviewWindowBuilder y WindowUrl ahora se llama WebviewUrl.
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 Archivos Adicionales Incrustados (Recursos)
Sección titulada «Migrar Archivos Adicionales Incrustados (Recursos)»En el lado de JavaScript, asegúrate de Migrar al Plugin del Sistema de Archivos. Además, ten en cuenta que los cambios hechos en la lista blanca de la v1 en Migrar Permisos.
En el lado de Rust, asegúrate de Migrar de Path a Tauri Manager.
Migrar de Binarios Externos Incrustados (Sidecar)
Sección titulada «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.
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 de seguridad.
© 2025 Tauri Contributors. CC-BY / MIT