Dependencias

La mayoría de los programas dependen de algunas bibliotecas. Si alguna vez ha manejado las dependencias a mano, sabe lo doloroso que puede ser esto. ¡Afortunadamente, el ecosistema Rust viene de serie con cargo! cargo puede gestionar las dependencias de un proyecto.

Para crear un nuevo proyecto de Rust,

# Un ejecutable
cargo new foo

# O una biblioteca
cargo new --lib foo

Para el resto de este capítulo, supongamos que estamos creando un ejecutable, en lugar de una biblioteca, pero todos los conceptos son iguales.

Después de los comandos anteriores, debería ver una jerarquía de archivos como esta:

foo
├── Cargo.toml
└── src
    └── main.rs

El main.rs es el archivo fuente raíz para tu nuevo proyecto, no hay nada nuevo allí. El Cargo.toml es el archivo de configuración de cargo para este proyecto (foo). Si miras dentro de él, deberías ver algo como esto:

[package]
name = "foo"
version = "0.1.0"
authors = ["mark"]

[dependencies]

El campo name debajo de [package] determina el nombre del proyecto. Este es usado por crates.io si publicas el crate (más adelante). También es el nombre del ejecutable de salida al compilar.

El campo version es un número de versión del crate que utiliza versionado semántico.

El campo authors es una lista de autores que se utiliza al publicar el crate.

La sección [dependencies] te permite agregar dependencias para tu proyecto.

Por ejemplo, supongamos que queremos que nuestro programa tenga una CLI excelente. Puedes encontrar muchos paquetes geniales en crates.io (el registro oficial de paquetes de Rust). Una opción popular es clap. En el momento de escribir estas líneas, la versión publicada más reciente de clap es 2.27.1. Para agregar una dependencia a nuestro programa, simplemente podemos agregar lo siguiente a nuestro Cargo.toml en [dependencies]:clap = "2.27.1". ¡Y eso es! Puedes empezar a usar clap en tu programa.

cargo también admite otros tipos de dependencias. Aquí solo una pequeña muestra:

[package]
name = "foo"
version = "0.1.0"
authors = ["mark"]

[dependencies]
clap = "2.27.1" # de crates.io
rand = { git = "https://github.com/rust-lang-nursery/rand" } # de repo en línea
bar = { path = "../bar" } # desde una ruta en el sistema local de archivos

cargo es más que un administrador de dependencias. Todas las opciones de configuración disponibles se enumeran en la especificación del formato de Cargo.toml.

Para construir nuestro proyecto podemos ejecutar cargo build en cualquier lugar del directorio del proyecto (¡incluidos los subdirectorios!). También podemos hacer cargo run para construir y ejecutar. Ten en cuenta que estos comandos resolverán todas las dependencias, descargarán crates si es necesario y construirán todo, incluida tu crate. (Ten en cuenta que solo reconstruye lo que aún no ha construido, similar a make).

¡Voila! ¡Eso es todo al respecto!