Saltar al contenido

Depender de lo que haya en la máquina

Una herramienta que el usuario tiene que tener instalada: cómo se busca, qué se hace si no está, y por qué la versión que encuentres nunca es la que probaste.

Las cinco formas de fallar

La segunda fila es la más desconcertante y merece recordarla: en macOS, una aplicación abierta con doble clic no tiene el mismo entorno que una terminal. Si tu código busca la herramienta solo en las rutas heredadas, va a decir que no está en máquinas donde sí está.

Localizar bien

Rust
fn localizar(nombre: &str) -> Option<PathBuf> {    // 1 · lo que el usuario haya configurado explícitamente, si lo ofreces    if let Some(p) = prefs::ruta_de_herramienta(nombre) { if p.exists() { return Some(p); } }    // 2 · las rutas habituales de cada sistema, no solo el entorno heredado    for base in RUTAS_HABITUALES {        let p = Path::new(base).join(nombre);        if p.exists() { return Some(p); }    }    // 3 · y el entorno, por si acaso    which(nombre).ok()}

El paso 1 es el que resuelve los casos raros sin que tengas que preverlos todos: una opción en preferencias donde el usuario puede indicar dónde está la herramienta convierte un fallo insalvable en una configuración de treinta segundos. Cuesta muy poco y es lo que aprecian los usuarios avanzados.

Comprobar la versión

Antes de confiar en una herramienta encontrada:

Rust
let v = Command::new(&ruta).arg("--version").output().await?;let version = interpretar_version(&v.stdout).ok_or(Error::VersionIlegible)?;if version < VERSION_MINIMA {    return Err(Error::VersionAntigua { encontrada: version, minima: VERSION_MINIMA });}

Y hacerlo una vez y guardarlo, no en cada lanzamiento: la comprobación cuesta arrancar un proceso, y con guardar el resultado en memoria mientras la aplicación viva es suficiente.

Qué decir cuando no está

El mensaje decide si el usuario resuelve el problema o abandona:

Y la decisión de fondo

Todo esto es el precio de depender del entorno. La alternativa —empaquetar la herramienta con tu aplicación— elimina las cinco filas de la tabla de golpe, a cambio de tamaño y de responsabilidades nuevas. Es el nivel 46.

La regla práctica: si la herramienta es imprescindible para el funcionamiento normal, empaquétala. Si es para una función avanzada que solo usan algunos, depender del entorno con un buen mensaje es razonable.