El archivo Cargo.toml es el corazón de cualquier proyecto en Rust. Escrito en formato TOML (Tom’s Obvious, Minimal Language), este archivo es el manifiesto que le indica a Cargo (el gestor de paquetes de Rust) cómo debe construir tu aplicación, qué metadatos la identifican y qué dependencias externas necesita para funcionar. Sin este archivo, el compilador no sabría el nombre de tu programa ni qué librerías externas debe descargar.

El archivo se divide en secciones clave. La sección [package] contiene la identidad del proyecto: su nombre, la versión (siguiendo la convención Semantic Versioning o SemVer), la edición de Rust que estás usando (como la 2021) y la licencia. Si cometes un error en el nombre o la versión, Cargo no podrá publicar tu paquete o lo confundirá con otro.

La sección [dependencies] es donde declaras las librerías externas (crates). Puedes especificar versiones exactas o rangos (como ^1.0, que permite actualizaciones menores pero no cambios que rompan el código). También existen las [dev-dependencies], que se utilizan únicamente durante las pruebas (cargo test) y no se incluyen cuando alguien usa tu código como una librería. Por otro lado, [build-dependencies] son para scripts de compilación personalizados.

Un concepto crucial es la diferencia entre Cargo.toml y Cargo.lock. Mientras que el .toml es tu intención de qué librerías quieres, el .lock contiene las versiones exactas y los hashes de seguridad que se instalaron. En proyectos binarios (aplicaciones), siempre se debe incluir el Cargo.lock en el repositorio para asegurar que todos los desarrolladores usen exactamente las mismas versiones. En librerías, se suele omitir para permitir que los usuarios finales tengan más flexibilidad con las versiones de las dependencias.

# [package] define la identidad del proyecto

[package]

name = “mi_primer_proyecto” version = “0.1.0” # Cumple con Semantic Versioning (SemVer) edition = “2021” # Define el comportamiento del lenguaje authors = [“Tu Nombre <tu@email.com>”] description = “Un ejemplo educativo de manifiesto Cargo” license = “MIT”

[dependencies]

# Versión compatible (permite actualizaciones de parches y minores) serde = “1.0” # Dependencia con características (features) específicas activadas rand = { version = “0.8”, features = [“std”] } # Dependencia descargada directamente desde un repositorio Git # some_crate = { git = “https://github.com/usuario/repo” }

[dev-dependencies]

# Solo se instalan y usan cuando ejecutas ‘cargo test’ pretty_assertions = “1.4”

[profile.release]

# Optimización máxima para el comando ‘cargo build –release’ opt-level = 3 lto = true # Link Time Optimization para un binario más rápido

Explicación del Código

En el ejemplo anterior, hemos estructurado el manifiesto de la siguiente manera:

  • [package]: Hemos definido la identidad de nuestro proyecto con el nombre mi_primer_proyecto y la versión 0.1.0. La propiedad edition = "2021" es fundamental, ya que activa las características de la edición de Rust 2021.
  • [dependencies]:
    • serde = "1.0" indica que queremos la librería serde en su versión 1.0 o cualquier versión compatible superior que no rompa la compatibilidad.
    • rand se configura mediante una tabla { version = "0.8", features = ["std"] }, donde indicamos que queremos activar específicamente la funcionalidad std de esa librería.
  • [dev-dependencies]: La librería pretty_assertions se añade aquí para que solo esté disponible durante las pruebas unitarias, manteniendo el binario final ligero.
  • [profile.release]: Esta sección configura cómo se compila el código cuando usas el flag --release. Hemos establecido opt-level = 3 para obtener el máximo rendimiento y lto = true para que el optimizador realice un análisis global durante el enlace, lo que resulta en un ejecutable más eficiente.

7