Actualizar desde Tauri 1.0
Esta guía te guía a través de la actualización de tu aplicación Tauri 1.0 a Tauri 2.0.
Preparándose para Mobile
Sección titulada «Preparándose para Mobile»La interfaz móvil de Tauri requiere que tu proyecto genere una biblioteca compartida. Si tu objetivo es el entorno móvil para tu aplicación existente, debes cambiar tu crate para producir ese tipo de artefacto junto con el ejecutable de escritorio.
- Cambia el manifiesto de Cargo para producir la biblioteca. Añade el siguiente bloque:
[lib]name = "app_lib"crate-type = ["staticlib", "cdylib", "rlib"]-
Renombra
src-tauri/src/main.rsasrc-tauri/src/lib.rs. Este archivo será compartido por los objetivos de escritorio y móviles. -
Renombra el encabezado de la función
mainenlib.rsa lo siguiente:
#[cfg_attr(mobile, tauri::mobile_entry_point)]pub fn run() { // your code here}La macro tauri::mobile_entry_point prepara tu función para ser ejecutada en móviles.
- Vuelve a crear el archivo
main.rsllamando a la función run compartida:
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
fn main() { app_lib::run();}Migración Automatizada
Sección titulada «Migración Automatizada»La CLI de Tauri v2 incluye un comando migrate que automatiza la mayor parte del proceso y te ayuda a completar 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 migrateObtén más información sobre el comando migrate en la referencia de la Interfaz de Línea de Comandos (CLI)
Resumen de Cambios
Sección titulada «Resumen de Cambios»A continuación se muestra un resumen de los cambios de Tauri 1.0 a Tauri 2.0:
Configuración de Tauri
Sección titulada “Configuración de Tauri”package > productNameypackage > versionse movieron al objeto de nivel superior.- el nombre del binario ya no se renombra para coincidir con
productNameautomáticamente, por lo que debes agregar una cadenamainBinaryNameal objeto de nivel superior que coincida conproductName. packageeliminado.- clave
taurirenombrada aapp. tauri > allowlisteliminado. Consulta Migrar Permisos.tauri > allowlist > protocol > assetScopemovido aapp > security > assetProtocol > scope. Consulta el Alcance del protocolo Asset paraenable, patrones glob,requireLiteralLeadingDoty rutas dinámicas.tauri > climovido aplugins > cli.tauri > windows > fileDropEnabledrenombrado aapp > windows > dragDropEnabled.tauri > updater > activeeliminado.tauri > updater > dialogeliminado.tauri > updatermovido aplugins > updater.bundle > createUpdaterArtifactsadded, must be set when using the app updater.- establécelo en
v1Compatibleal actualizar desde aplicaciones v1 que ya estaban distribuidas. Consulta la guía del actualizador para obtener más información.
- establécelo en
tauri > systemTrayrenombrado aapp > trayIcon.tauri > patternmovido aapp > security > pattern.tauri > bundlemovido al nivel superior.tauri > bundle > identifiermovido al objeto de nivel superior.tauri > bundle > dmgmovido abundle > macOS > dmgtauri > bundle > debmovido abundle > linux > debtauri > bundle > appimagemovido abundle > linux > appimagetauri > bundle > macOS > licenseeliminado, usabundle > licenseFileen su lugar.tauri > bundle > windows > wix > licenseeliminado, usabundle > licenseFileen su lugar.tauri > bundle > windows > nsis > licenseeliminado, usabundle > licenseFileen su lugar.tauri > bundle > windows > webviewFixedRuntimePatheliminado, usabundle > 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
Nuevas Características de Cargo
Sección titulada «Nuevas Características de Cargo»- linux-protocol-body: Permite el análisis del cuerpo de solicitudes del protocolo personalizado, permitiendo que el IPC lo use. Requiere webkit2gtk 2.40.
Características de Cargo Eliminadas
Sección titulada «Características de Cargo Eliminadas»- reqwest-client: reqwest es ahora el único cliente soportado.
- reqwest-native-tls-vendored: usa
native-tls-vendoreden su lugar. - process-command-api: usa el plugin
shellen su lugar (ver instrucciones en la siguiente sección). - shell-open-api: usa el plugin
shellen su lugar (ver instrucciones en la siguiente sección). - windows7-compat: movido al plugin
notification. - updater: Updater es ahora un plugin.
- linux-protocol-headers: Ahora habilitado por defecto ya que actualizamos nuestra versión mínima de webkit2gtk.
- system-tray: renombrado a
tray-icon.
Cambios en Crates de Rust
Sección titulada «Cambios en Crates de Rust»- módulo
apieliminado. Cada módulo API se puede encontrar en un plugin de Tauri. - módulo
api::dialogeliminado. Usatauri-plugin-dialogen su lugar. Migración - módulo
api::fileeliminado. Usastd::fsde Rust en su lugar. - módulo
api::httpeliminado. Usatauri-plugin-httpen su lugar. Migración - módulo
api::ipreescrito y movido atauri::ipc. Revisa las nuevas API, especialmentetauri::ipc::Channel. - funciones del módulo
api::pathytauri::PathResolvedmovidas atauri::Manager::path. Migración - API de
api::process::Command,tauri::api::shellytauri::Manager::shell_scopeeliminadas. Usatauri-plugin-shellen su lugar. Migración api::process::current_binaryytauri::api::process::restartmovidos atauri::process.- módulo
api::versionha sido eliminado. Usa el crate semver en su lugar. App::clipboard_manageryAppHandle::clipboard_managereliminados. Usatauri-plugin-clipboarden su lugar. MigraciónApp::get_cli_matcheseliminado. Usatauri-plugin-clien su lugar. MigraciónApp::global_shortcut_manageryAppHandle::global_shortcut_managereliminados. Usatauri-plugin-global-shortcuten su lugar. MigraciónManager::fs_scopeeliminado. El alcance del sistema de archivos se puede acceder a través detauri_plugin_fs::FsExt.Plugin::PluginApiahora recibe una configuración de plugin como segundo argumento.Plugin::setup_with_configremoved. Use the updatedtauri::Plugin::PluginApiinstead.scope::ipc::RemoteDomainAccessScope::enable_tauri_apiandscope::ipc::RemoteDomainAccessScope::enables_tauri_apiremoved. Enable each core plugin individually viascope::ipc::RemoteDomainAccessScope::add_plugininstead.scope::IpcScoperemoved, usescope::ipc::Scopeinstead.scope::FsScope,scope::GlobPatternandscope::FsScopeEventremoved, usescope::fs::Scope,scope::fs::Patternandscope::fs::Eventrespectively.updatermodule removed. Usetauri-plugin-updaterinstead. MigrationEnv.argsfield has been removed, useEnv.args_osfield instead.Menu,MenuEvent,CustomMenuItem,Submenu,WindowMenuEvent,MenuItemandBuilder::on_menu_eventAPIs removed. MigrationSystemTray,SystemTrayHandle,SystemTrayMenu,SystemTrayMenuItemHandle,SystemTraySubmenu,MenuEntryandSystemTrayMenuItemAPIs removed. Migration
Cambios en la API de JavaScript
Section titled “JavaScript API Changes”The @tauri-apps/api package no longer provides non-core modules. Only the previous tauri (now core), path, event and window modules are exported. All others have been moved to plugins.
@tauri-apps/api/taurimodule renamed to@tauri-apps/api/core. Migration@tauri-apps/api/climodule removed. Use@tauri-apps/plugin-cliinstead. Migration- módulo
@tauri-apps/api/clipboardeliminado. Usa@tauri-apps/plugin-clipboarden su lugar. Migración - módulo
@tauri-apps/api/dialogeliminado. Usa@tauri-apps/plugin-dialogen su lugar. Migración - módulo
@tauri-apps/api/fseliminado. Usa@tauri-apps/plugin-fsen su lugar. Migración - módulo
@tauri-apps/api/global-shortcuteliminado. Usa@tauri-apps/plugin-global-shortcuten su lugar. Migración - módulo
@tauri-apps/api/httpeliminado. Usa@tauri-apps/plugin-httpen su lugar. Migración - módulo
@tauri-apps/api/oseliminado. Usa@tauri-apps/plugin-osen su lugar. Migración - módulo
@tauri-apps/api/notificationeliminado. Usa@tauri-apps/plugin-notificationen su lugar. Migración - módulo
@tauri-apps/api/processeliminado. Usa@tauri-apps/plugin-processen su lugar. Migración - módulo
@tauri-apps/api/shelleliminado. Usa@tauri-apps/plugin-shellen su lugar. Migración - módulo
@tauri-apps/api/updatereliminado. Usa@tauri-apps/plugin-updateren su lugar Migración - módulo
@tauri-apps/api/windowrenombrado a@tauri-apps/api/webviewWindow. Migración
Los plugins v1 ahora se publican como @tauri-apps/plugin-<plugin-name>. Anteriormente estaban disponibles desde git como tauri-plugin-<plugin-name>-api.
Cambios en Variables de Entorno
Sección titulada «Cambios en Variables de Entorno»La mayoría de las variables de entorno leídas y escritas por la CLI de Tauri fueron renombradas por consistencia y para prevenir 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
Sección titulada «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 objetivos de eventos.
- La función
emitahora emite el evento a todos los oyentes de eventos. - Se agregó una nueva función
emit_to/emitTopara activar un evento en un objetivo específico. emit_filterahora filtra según elEventTargeten lugar de una ventana.- Se renombró
listen_globalalisten_any. Ahora escucha todos los eventos independientemente de sus filtros y objetivos. - JavaScript:
event.listen()se comporta de forma similar alisten_any. Ahora escucha todos los eventos independientemente de sus filtros y objetivos, a menos que se establezca un objetivo enOptions. - JavaScript:
WebviewWindow.listenetc. solo escuchan los eventos emitidos hacia su respectivoEventTarget.
Soporte multi-webview
Sección titulada «Soporte multi-webview»Tauri v2 introduce soporte para multi-webview actualmente detrás de un flag de característica inestable.
Para soportarlo, renombramos el tipo Rust Window a WebviewWindow y la función Manager get_window 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.
Nueva URL de origen en Windows
Sección titulada «Nueva URL de origen en Windows»En Windows, los archivos del frontend en aplicaciones de producción ahora se alojan en http://tauri.localhost en lugar de https://tauri.localhost. Debido a esto, IndexedDB, LocalStorage y Cookies se restablecerán a menos que se haya utilizado dangerousUseHttpScheme en v1. Para evitar esto, puedes configurar app > windows > useHttpsScheme en true o usar WebviewWindowBuilder::use_https_scheme para seguir usando el esquema https.
Pasos Detallados de Migración
Sección titulada «Pasos Detallados de Migración»Escenarios comunes que podrías encontrar al migrar tu aplicación de Tauri 1.0 a Tauri 2.0.
Migrar al Módulo Core
Sección titulada «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
Sección titulada «Migrar al Plugin CLI»Las API de Rust App::get_cli_matches y JavaScript @tauri-apps/api/cli han sido eliminadas. Usa el plugin @tauri-apps/plugin-cli en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-cli = "2"- Usar en proyecto 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 Clipboard
Sección titulada «Migrar al Plugin Clipboard»Las API de Rust App::clipboard_manager y AppHandle::clipboard_manager y JavaScript @tauri-apps/api/clipboard han sido eliminadas. Usa el plugin @tauri-apps/plugin-clipboard-manager en su lugar:
[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 Dialog
Sección titulada «Migrar al Plugin Dialog»Las API de Rust tauri::api::dialog y JavaScript @tauri-apps/api/dialog han sido eliminadas. Usa el plugin @tauri-apps/plugin-dialog en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-dialog = "2"- Usar en proyecto 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| { // 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(()) })Migrar al Plugin File System
Sección titulada «Migrar al Plugin File System»Las API de Rust tauri::api::file y JavaScript @tauri-apps/api/fs han sido eliminadas. Usa std::fs para Rust y el plugin @tauri-apps/plugin-fs para JavaScript en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-fs = "2"- Usar en proyecto 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:
- Alias del enum
Direliminado, usaBaseDirectory. - Las interfaces y alias de tipos
FileEntry,FsBinaryFileOption,FsDirOptions,FsOptions,FsTextFileOptionyBinaryFileContentshan sido eliminados y reemplazados con nuevas interfaces adecuadas para cada función. createDirrenombrado amkdir.readBinaryFilerenombrado areadFile.removeDireliminado y reemplazado conremove.removeFileeliminado y reemplazado conremove.renameFileeliminado y reemplazado conrename.writeBinaryFilerenombrado awriteFile.
Usa las funciones de std::fs de Rust.
Migrar al Plugin Global Shortcut
Sección titulada «Migrar al Plugin Global Shortcut»Las API de Rust App::global_shortcut_manager y AppHandle::global_shortcut_manager y JavaScript @tauri-apps/api/global-shortcut han sido eliminadas. Usa el plugin @tauri-apps/plugin-global-shortcut en su lugar:
- Añadir a las dependencias de cargo:
[dependencies][target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies]tauri-plugin-global-shortcut = "2"- Usar en proyecto 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| { // 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(()) })Migrar al Plugin HTTP
Sección titulada «Migrar al Plugin HTTP»Las API de Rust tauri::api::http y JavaScript @tauri-apps/api/http han sido eliminadas. Usa el plugin @tauri-apps/plugin-http en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-http = "2"- Usar en proyecto 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 Notification
Sección titulada «Migrar al Plugin Notification»Las API de Rust tauri::api::notification y JavaScript @tauri-apps/api/notification han sido eliminadas. Usa el plugin @tauri-apps/plugin-notification en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-notification = "2"- Usar en proyecto 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 Menu
Sección titulada «Migrar al Módulo Menu»Las API de Rust Menu se movieron al módulo tauri::menu y se refactorizaron para usar el crate muda.
Usa tauri::menu::MenuBuilder
Sección titulada «Usar tauri::menu::MenuBuilder»Usa tauri::menu::MenuBuilder en lugar de tauri::Menu. Ten en cuenta que su constructor toma una instancia de Manager (una 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()?; app.set_menu(menu); Ok(()) })Usa tauri::menu::PredefinedMenuItem
Sección titulada «Usar tauri::menu::PredefinedMenuItem»Usa 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(()) })Usa tauri::menu::MenuItemBuilder
Sección titulada «Usar tauri::menu::MenuItemBuilder»Usa 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(()) })Usa tauri::menu::SubmenuBuilder
Sección titulada «Usar tauri::menu::SubmenuBuilder»Usa 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 closure porque el menú necesita una instancia de Manager para ser construido. Consulta la documentación para obtener más información.
Eventos de Menú
Sección titulada «Eventos de Menú»La API de Rust tauri::Builder::on_menu_event fue eliminada. Usa tauri::App::on_menu_event o tauri::AppHandle::on_menu_event en su lugar:
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 de menú fue seleccionado: mover el elemento al closure del controlador de eventos y comparar los ID, o definir un ID personalizado para el elemento a través del constructor with_id y usar esa cadena de ID para comparar.
Migrar al Plugin OS
Sección titulada «Migrar al Plugin OS»Las API de Rust tauri::api::os y JavaScript @tauri-apps/api/os han sido eliminadas. Usa el plugin @tauri-apps/plugin-os en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-os = "2"- Usar en 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
Sección titulada «Migrar al Plugin Process»Las API de Rust tauri::api::process y JavaScript @tauri-apps/api/process han sido eliminadas. Usa el plugin @tauri-apps/plugin-process en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-process = "2"- Usar en proyecto 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
Sección titulada «Migrar al Plugin Shell»Las API de Rust tauri::api::shell y JavaScript @tauri-apps/api/shell han sido eliminadas. Usa el plugin @tauri-apps/plugin-shell en su lugar:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-shell = "2"- Usar en proyecto 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(()) })}- Iniciar un proceso hijo y recuperar 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(()) })}- Iniciar 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(()) })}- Iniciar un proceso hijo y leer 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 Tray Icon
Sección titulada «Migrar al Módulo Tray Icon»Las API de Rust SystemTray fueron renombradas a TrayIcon por consistencia. Las nuevas API se pueden encontrar en el módulo Rust tray.
Usa tauri::tray::TrayIconBuilder
Sección titulada «Usar tauri::tray::TrayIconBuilder»Usa tauri::tray::TrayIconBuilder en lugar de tauri::SystemTray:
let tray = tauri::tray::TrayIconBuilder::with_id("my-tray").build(app)?;Consulta TrayIconBuilder para obtener más información.
Migrar a Menu
Sección titulada «Migrar a Menu»Usa 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.
Eventos del Tray
Sección titulada «Eventos del Tray»tauri::SystemTray::on_event se ha 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(()) })Migrar al Plugin Updater
Sección titulada «Migrar al Plugin Updater»Las API de Rust tauri::updater y JavaScript @tauri-apps/api-updater han sido eliminadas. Para establecer un objetivo de actualizador personalizado con @tauri-apps/plugin-updater:
- Añadir a las dependencias de cargo:
[dependencies]tauri-plugin-updater = "2"- Usar en proyecto 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 verificar 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 actualizador 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 Path al Administrador de Tauri
Sección titulada «Migrar Path al Administrador de Tauri»Las funciones del módulo Rust tauri::api::path y tauri::PathResolver se han movido 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 Window
Sección titulada «Migrar a la nueva API de Window»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 de la ventana parent_window fue renombrada a parent_raw para soportar una API de ventana padre 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, puedes interceptar eventos de menú al crear un menú en JavaScript en su lugar.
Migrar Archivos Adicionales Embebidos (Recursos)
Sección titulada «Migrar Archivos Adicionales Embebidos (Recursos)»En el lado de JavaScript, asegúrate de Migrar al Plugin File System. Además, ten en cuenta los cambios realizados en la lista de permitidos de la v1 en Migrar Permisos.
En el lado de Rust, asegúrate de Migrar Path al Administrador de Tauri.
Migrar Binarios Externos Embebidos (Sidecar)
Sección titulada «Migrar Binarios Externos Embebidos (Sidecar)»En Tauri v1, los binarios externos y sus argumentos se definían en la lista de permitidos. En v2, usa el nuevo sistema de permisos. Lee Migrar Permisos para obtener 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 fue eliminada. Usa las API tauri_plugin_shell::ShellExt y tauri_plugin_shell::process::CommandEvent en su lugar. Lee la guía de Incrustar Binarios Externos para ver cómo.
La flag de características “process-command-api” se eliminó en la v2. Por lo tanto, ejecutar binarios externos ya no requiere que esta característica esté definida en la configuración de Tauri.
Migrar Permisos
Sección titulada «Migrar Permisos»La lista de permitidos de v1 ha sido reescrita en un sistema de permisos completamente nuevo que funciona para plugins individuales y es mucho más configurable para soporte de 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 por ti.
El comando de la CLI migrate analiza automáticamente tu lista de permitidos v1 y genera el archivo de capacidades asociado.
Para obtener más información sobre permisos y capacidades, consulta la documentación de seguridad.
© 2026 Colaboradores de Tauri. CC-BY / MIT