Cargo ¿run?
En el capítulo anterior creamos nuestro primer programa en Rust, un simple "Hola mundo".
Pero pensemos un momento: ¿Y si deseamos crear un proyecto más grande?, ¿Qué tal si necesitamos crear una herramienta de línea de comandos más compleja? o quizá tenemos una gran idea para crear un API para usarse en Inteligencia Artificial.
De una forma u otra necesitaremos una forma de manejar nuestro
proyecto de manera eficiente, aquí entra cargo
el gestor de paquetes
de Rust.
Cargo no solo se limita a ser un gestor de paquetes, también es un sistema de construcción y un excelente manejador de dependencias. Muchos programadores de Rust, a los cuales llamaremos Rustáceos en adelante (Derivado de la palabra "Crustáceos") utilizan cargo para manejar sus proyectos ya que éste realiza muchas acciones por nosotros, descarga y compila las bibliotecas que son dependencias de nuestro código, le da formato a nuestro código si somos inexpertos en el tema, ejecuta pruebas y despliega nuestro código listo para enviarse a producción.
Casi todos (por no decir la palabra "Todos") los proyectos de Rust
utilizan Cargo, si has instalado Rust utilizando el instalador oficial
(rustup
) entonces ya posees Cargo instalado y listo para usarse.
Primer proyecto con Cargo
Para crear un nuevo proyecto utilizando Cargo debemos ejecutar el siguiente comando:
$ cargo new --bin hola_cargo
Esto creará un nuevo proyecto de Cargo, si entramos en el directorio
creado nos daremos cuenta que dentro hay varios archivos, un directorio
y que se ha inicializado un nuevo repositorio con la herramienta git
.
Vamos a editar el archivo más llamativo del directorio llamado
Cargo.toml
:
[package]
name = "hola_cargo"
version = "0.1.0"
authors = ["nombre <nombre@ejemplo.com>"]
edition = "2018"
[dependencies]
La primera línea del archivo es la sección [package]
que indicará
todos los detalles al momento de configurar un paquete de Cargo.
Las siguientes líneas contienen información necesaria para poder construir y compilar el paquete en cuestión:
- Nombre del paquete o
crate
. - Versión del paquete
- Autor o autores del paquete
- La edición de Rust (Hablaremos más adelante de eso).
La siguiente sección se llama [dependencies]
, debajo de esta se
colocarán todas las dependencias requeridas para construir nuestro
paquete de Rust, las usaremos más adelante.
Como mencionamos más arriba, cargo genera un directorio de nombre src
en el cual se incluye un archivo llamado main.rs
, este archivo en
cuestión contiene un "Hello World" dentro.
Cargo asume que TODOS tus archivos de código fuente se encontrarán
dentro del directorio src/
ya que el directorio raíz del proyecto solo
estará dedicado a información acerca del mismo, véase archivos README
,
LICENSE
o las configuraciones escritas en TOML.
Ejecutar proyectos utilizando cargo
Si deseamos construir un proyecto utilizando Cargo solo es necesario escribir en nuestra terminal (dentro del directorio de nuestro proyecto):
$ cargo build
La saluda de la terminal nos debería mostrar una salida indicandonos si nuestro proyecto se pudo construir o si falló en algún punto:
Compiling hola_cargo v0.1.0 (/home/FutureLab/Escritorio/hola_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.39s
Cuando le damos la instrucción build
a cargo éste creará un binario
ejecutable en un nuevo árbol de directorios, específicamente dentro
de target/debug/<archivo binario>
.
Además de compilar un binario ejecutable Cargo también descargará y
compilará las dependencias necesarias para nuestro proyecto, al mismo
tiempo creará un archivo nuevo llamado Cargo.lock
, no te alarmes,
este archivo vigilará las versiones de tus dependencias.
Si bien podríamos ejecutar los binarios desde su ruta con
$ ./target/debug/hola_cargo
esto es ineficiente, por lo que cargo
tiene otra función para compilar y ejecutar nuestros proyectos en un
solo comando:
$ cargo run
Si ejecutamos esta orden, Cargo buscará los archivos .rs
dentro de
nuestro directorio src/
, los compilará e inmediatamente después los
ejecutará si no encontró problema alguno.
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/hola_cargo`
Hello, world!
Cargo posee una variedad de comandos entre ellos:
check
=> Se encarga de revisar que el código compile sin producir ejecutables.clean
=> Elimina el directoriotarget/
.doc
=> Construye el paquete y sus dependencias con documentación.init
=> Crea un nuevo proyecto en un directorio existente.test
=> Ejecuta las pruebas.bench
=> Ejecuta puntos de referencia.update
=> Actualiza las dependencias deCargo.lock
.search
=> Buscacrates
en el registro.publish
=> Publica el paquete actual al registro.install
=> Instala un binario de Rust en$HOME/.cargo/bin
.uninstall
=> Desinstala un binario de Rust.
La ventaja de Cargo es que los comandos que se pueden ejecutar son independientes de cualquier plataforma por lo que funciona de la misma manera en Windows, MacOS y Gnu/Linux.
Liberar un paquete
Cuando hayas terminado tu proyecto solo necesitarás la bandera
--release
para generar un binario optimizado, esto generará un
binario ejecutable en el directorio target/release
.
Fin de la lección
Por ahora has aprendido a utilizar Cargo y a crear un pequeño hola mundo en Rust, pero imprimir mensajes de ese tipo en la consola no es divertido por lo que en el siguiente capítulo crearemos un programa llamado "FizzBuzz" el cual es una pregunta utilizada en las entrevistas de programación.
¡Prepárate para comenzar a utilizar Cargo de verdad!