Anuncios

Bienvenidos sean a este post, hoy veremos como crear una aplicación distribuible.

Anuncios

Ya hemos visto como crear proyectos con cargo, modificarlos, compilarlos y ejecutarlos pero hasta ahora no los hemos hecho distribuible. Es decir, que podamos ejecutarlo como un programa autónomo para que podamos correrlo sin cargo y veremos como aplicar algunas de las herramientas que hemos visto anteriormente. El programa que crearemos es para rotar noventa grados una imagen cualquiera. Antes de comenzar nuestro proyecto, deben descargar el siguiente archivo:

Anuncios

Tengan este archivo a mano porque pronto lo usaremos. Generen un nuevo proyecto con cargo llamado hmtimg. Ingresen al directorio del proyecto y ejecuten el siguiente comando:

$ cargo add image@0.25.10
Anuncios

Este nos agrega una dependencia, la cual usaremos para manipular la imagen que descargamos anteriormente. Si observan a Cargo.toml tendremos los siguientes datos:

[package]
name = "hmtimg"
version = "0.1.0"
edition = "2024"
[dependencies]
image = "0.25.10"
Anuncios

Lo siguiente es crear un directorio con el nombre de assets en el directorio del proyecto y en este copiaremos el archivo descargado. Antes de continuar con nuestro proyecto, veamos su estructura actual:

.
├── assets
│   └── images.png
├── Cargo.lock
├── Cargo.toml
└── src
└── main.rs
Anuncios

Con todo esto realizado, vayan a main.rs y modifiquen el código existente de la siguiente manera:

Rust
use std::env;
use std::path::Path;
fn main() {
let path_imagen = env::args().skip(1).next().unwrap();
let path = Path::new(&path_imagen);
let img = image::open(path).unwrap();
let rotado = img.rotate90();
rotado.save(path).unwrap();
}
Anuncios
Anuncios

Las dos primeras líneas se usan para cargar las líbrerias que nos permitan trabajar con el entorno de nuestro S.O. La primera es para manipular los datos de entorno de nuestro S.O. y la segunda es para manejar los path en el S.O. Estas nos serán muy útiles principalmente para informarle la ubicación del archivo a trabajar pero de eso hablaremos cuando lo ejecutemos. La primer variable almacenará la ubicación de la imagen a modificar pasada como argumento. La segunda es la encargada de crear el path donde esta el archivo a modificar, tomando como base el argumento informado. La tercera es para obtener al archivo en sí mediante unwrap. Al archivo obtenido le aplicamos rotate90 para girarlo noventa grados y lo almacenamos en la variable rotado. Para finalmente, aplicar esta modificación en el archivo. Con esto tenemos dos opciones: compilan el código mediante cargo build, o lo ejecutan directamente de la siguiente manera:

$ cargo run -- assets/images.png
Anuncios

En este caso, la primera vez hará una compilacióo del código con todas las dependencias necesarias. Para una vez finalizada, procede con la ejecución del código. Veamos como funciona mediante el siguiente video:

Anuncios

Como pueden ver al momento de ejecutar el programa, nuestra imagen en assets rotó automáticamente, haciendo todo lo comentado anteriormente. Tenemos la posibilidad de usar una opción llamada install para «instalar» nuestra aplicación pero lo probé y es demasiado complicado. Aunque disponemos de otra opción. Esta es creada al momento de compilarlo, ya sea con build o run, se genera la aplicación. Este siempre se encuentra en el siguiente path:

/<nombre_proyecto>/target/debug/
Anuncios

Siempre en el directorio debug y para poder usarlo como un programa simplemente copien este directorio en otro destino o lo ejecutan desde ahi. En lo personal prefiero copiarlo en un lugar mas accesible. Les dejo cual fue mi comando para copiarlo:

$ cp -R ~/lenguajes/rust/blog/04/hmtimg/target/debug/ ~/htmimg/
Anuncios

Fundamental, no se olviden la opción -R para copiar todo el contenido del origen al destino. El destino es en el home de mi usuario y cambien el nombre del destino para identificarlo de mejor manera. Les muestro un ejemplo de como funciona ahora:

Anuncios

En el video vemos como usamos el programa generado y le pasamos otra imagen para ver como trabaja de la misma manera.

Anuncios

Para ir finalizando, vamos a usar una herramienta pensada para los sistemas basados en Debian, como es cargo-deb. Para ello, debemos volver a la raíz de nuestro proyecto y modificar a Cargo.toml de la siguiente manera:

Cargo.toml
[package]
name = "hmtimg"
version = "0.1.0"
edition = "2024"
description = "Herramienta para imagenes de prueba"
license = "MIT"
[package.metadata.deb]
maintainer = "Tinchicus <webmaster@tinchicus.com>"
priority = "optional"
section = "utilities"
[dependencies]
image = "0.25.10"
Anuncios
Anuncios

Esta es una configuración básica para poder generar un paquete .deb y poder instalar nuestro programa en cualquier equipo. La primera modificación que realizamos fue en la sección de package, agregamos la descripción. No es obligatorio pero agrega más información al paquete. Lo siguiente que agregamos es el tipo de licencia que usaremos. Nuevamente, no es obligatorio pero a más información más completo es el paquete. Luego tenemos la sección package.metadata.deb que será la información para generar el paquete. Existe un campo llamado name que es opcional, si lo informan toma ese valor como nombre del paquete pero sino lo informamos lo toma del nombre del proyecto, esto es lo más recomendable. El campo maintainer es para indicar quien es su responsable, priority es para indicar si se requiere o es opcional El campo section indica la categoría donde pertenece esta aplicación. Otro campo útil es assets, el cual sirve para indicar donde se instalará, establecer los permisos, así como también la documentación de este. Sino lo informamos como en este caso, lo instala automáticamente en /usr/bin. Con este archivo modificado, solamente deben correr el siguiente comando en la raíz del directorio del proyecto:

$ cargo deb
Anuncios

Y comenzará con la creación del archivo. Una vez finalizado, la ubicación de este es en:

/<nombre_proyecto>/target/debian
Anuncios

Les muestro como quedó en mi caso:

tinchicus@dbn001vrt:~/lenguajes/rust/blog/04/hmtimg/target/debian$ ls -l
total 1604
-rw-r--r-- 1 tinchicus tinchicus 1640140 abr 28 00:24 hmtimg_0.1.0-1_amd64.deb
tinchicus@dbn001vrt:~/lenguajes/rust/blog/04/hmtimg/target/debian$
Anuncios

Para instalarlo, se puede hacer de dos maneras, la primera es mediante el comando dpkg:

$ sudo dpkg -i hmtimg_0.1.0-1_amd64.deb
Anuncios

Para poder instalarlo siempre van a necesitar privilegios, por eso deben instalarlo con root o los permisos de sudo (si poseen). Una vez instalado, al estar en /usr/bin ya se encuentra en el path y podemos invocarlo desde donde sea. Veamos un video donde lo ejecuto en otro equipo donde lo instale:

Anuncios

En el video pueden ver como funciona correctamente en un equipo distinto al usado para el desarrollo. Por ende, podemos distribuir sin «inconvenientes» nuestro programa. No es tan así, por qué necesitamos completar más documentación y certificados para que el sistema realmente confié en nuestro programa. Aunque igualmente pueden distribuirlo porque es instalable y funcional.

Anuncios

La otra manera de instalarlo es mediante el programa Software que posee debian o una GUI para dpkg y podamos algo de la información que agregamos para el paquete. Les dejó una muestra de como se ve nnestro paquete en Software

Anuncios

En resumen, hoy hemos visto como crear un programa para hacerlo distribuible, para ello usamos algunas herramientas que hemos mencionado en otro post. Hemos visto un paso a paso para completar los requerimientos, como probarlo, así como también crear nn instalador para usarlo en otro equipo sin necesidad de preocuparnos por las dependencias. Espero les haya sido de utilidad y les dejo un link a GitHub donde estan los codigos creados hoy:

https://github.com/tinchicus/RUST-codes/tree/main/hmtimg

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50