programming, rust

Cargo. Configurando nuestro proyecto.

cargo

En el anterior post escribimos nuestro primer programa en Rust, para ellos creamos un fichero .rs donde pusimos la implementación, sin embargo cuando creemos proyectos con Rust, usaremos una aproximación diferente.

Integrado en Rust tenemos una herramienta que nos ayudará a crear y configurar nuestros proyectos. Esta herramienta es cargo y es algo que si habéis desarrollado en otros lenguajes como C o C++ os va a gustar bastante.

cargo nos va a permitir desde crear el proyecto hasta descargar las librerías de las que depende nuestro proyecto y que previamente habremos definido en un fichero de texto. Sin duda esta herramienta no es nueva, según sea nuestro habitual entorno de trabajo herramientas como gradle, maven, bower, glide o cocoapods nos seran familiares.

Sin más pausa, vamos a ponernos manos a la obra con cargo, para ello abriremos nuestra terminal de elección y escribiremos

$ cargo new proyecto1

Después de ejecutar el comando veremos que se crea un directorio proyecto1 donde estara el fichero de configuración de proyecto Cargo.toml y un directorio src donde residirá nuestro código fuente.

Por defecto, cargo crea proyectos del tipo librería, esto es, no poseen un punto de entrada y al construirse no generan un ejecutable. En su lugar este tipo de proyectos generar un fichero de tipo rlib, que en el futuro trataremos en el blog.

Para crear un proyecto ejecutable escribiremos

$ cargo new proyecto1 --bin

Veremos que en este caso, el fichero que se genera en el directorio src será main.rs, con la función main definida.

Cargo también nos permite construir y ejecutar nuestro proyecto, para ello ejecutaremos desde el directorio de proyecto

$ cargo build

o para ejecutarlo y ver por pantalla el “Hello World” autogenerado

$ cargo run

Como propina, cargo además nos creará un repositorio git para el proyecto, (hasta con su fichero .gitignore!).

Las bondades de cargo no acaban aqui, uno de sus puntos fuertes es la instalación y gestión de dependencias. Con seguridad nuestro proyecto necesitará usar librerías de terceros. Si pensamos en C o C++, este proceso suele ser “doloroso”, si no usamos ninguna herramienta, acabaremos por tener que especificar a mano un montón de rutas de ficheros .h o de la localización de las librerías. Rust usa cargo para hacer este proceso lo más sencillo posible. Si por ejemplo queremos usar la librería regex para expresiones regulares, deberemos ejecutar

$ cargo search regex

Y obtendremos una lista de librerías que nos ayudarán a usar expresiones regulares en nuestro proyecto.

Para instalar dicha librería primero tenemos que echar un vistazo al fichero Cargo.toml que antes vimos cuando generamos el proyecto.

En dicho fichero encontraremos diferentes secciones, el lenguaje elegido para la configuración es TOML (Tom’s Obvious Minimal Languaje). Cuando generamos nuestro proyecto automáticamente se genera la parte de [package] que describe cosas como la versión o autor de nuestro proyecto. Para añadir una dependencia deberemos añadirla a la sección de [dependencies], con lo que nuestro fichero quedaría como:

[package]
name = "proyecto1"
version = "0.1.0"
authors = [" <>"]

[dependencies]
regex = "0.1.18"

Una vez que hemos especificado nuestras dependencias, solo deberemos ejecutar de nuevo $ cargo build para que automáticamente cargo descargue las dependencias.

La instalación se realiza de forma local al proyecto, y cargo se encargará de que en el momento de construir el proyecto, las librerías estén en su sitio.

Pero aún hay más, supongamos que la librería que queremos usar depende de otras (como de hecho es el caso de regex, y que habréis podido ver al ejecutar build). Si de nuevo volvemos a C/C++, el proceso de descargar y referenciar las dependencias lo deberemos hacer a mano, en Rust cargo lo hace de forma automática, nosotros solo tenemos que instalar la librería que necesitamos y cargo se encargará de todo lo demás.

Con todo lo que hemos mencionado en el post, ha quedado claro que cargo es una utilidad imprescindible a la hora de trabajar con Rust, y que desde luego, si habéis desarrollado en otros lenguajes que carezcan de algo así, lo echareis de menos.

Además de todo lo dicho, también podremos usar cargo para multitud de cosas más como ejecutar nuestros test, ejecutar las pruebas de rendimiento, generar la documentación, empaquetar nuestro binario o librería o manejar el repositorio git del proyecto.

Después de conocer cargo, estamos totalmente preparados para centrarnos en el propio lenguaje, por lo que en los próximos posts entraremos en detalle en Rust.