¡Recomendación! Usar el gestor de dependencias y de proyectos cargo (ver documentación original).

Primer proyecto

Desde el directorio donde se quiere crear el proyecto, ejecutar:

$ cargo new --bin mi_servidor_web
     Created binary (application) `mi_servidor_web` package
  • Ver la guía de estilo para los nombres de proyecto.
  • Con Rust se pueden crear aplicaciones ejecutables o librerías para otros programas.
  • La opción --bin es opcional y se asume por defecto, indica a Cargo que el resultado final será un ejecutable, y no una librería (--lib).

Qué se ha creado

Un nuevo directorio llamado mi_servidor_web con los siguientes archivos:

$ cd mi_servidor_web
$ ls -lR
total 8
-rw-r--r--  1 user  group  212  jun 12:00 Cargo.TOML
drwxr-xr-x  3 user  group  512  jun 12:00 src

./src:
total 8
-rw-r--r--  1 user  group  45  jun 12:00 main.rs
  • Más la estructura de archivos para Git. Puede usarse otro VCS usando la opción --VCS, o ninguno si se añade --VCS none (ver opciones de cargo new).
  • El directorio raíz del proyecto podrá usarse para archivos README, licencias de uso, archivos de configuración y todo lo que no esté relacionado con el código.
  • Cargo espera que los archivos del código fuente estén en el directorio src.
  • Los archivos de código fuente en Rust usan la extensión .rs.
  • En src/main.rs está la función fn main() que es siempre el primer código que se ejecuta en cualquier programa Rust.

Modificar la configuración del proyecto

El archivo Cargo.TOML, también llamado manifiesto, contiene información y dependencias del proyecto. Fácil de leer gracias al formato TOML, se puede editar para añadir nuevas dependencias:

[package]
name = "mi_servidor_web"
version = "0.1.0"
authors = ["User Name Email"]
edition = "2018"

[dependencies]
actix-web = "2.0"
actix-rt = "1.0"

La primera línea [package] define una sección para configurar el proyecto. Y en la sección [dependencies] se añaden los paquetes requeridos, llamados crates.

Vamos a crear un servidor web usando Actix-web.

Programar el servidor web

Editar el archivo src/main.rs para incluir este código:

use actix_web::{web, App, HttpResponse, HttpServer, Responder};

async fn index() -> impl Responder {
    HttpResponse::Ok().body("Hello world!")
}

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        App::new()
            .route("/", web::get().to(index))
    })
    .bind("127.0.0.1:8088")?
    .run()
    .await
}

Compilar el proyecto

$ cargo build
   Compiling libc v0.2.72
   Compiling proc-macro2 v1.0.18
   ...
   Compiling mi_servidor_web v0.1.0 (/Users/USUARIO/mi_servidor_web)
    Finished dev [unoptimized + debuginfo] target(s) in Xm Ys
  • Cargo invoca aquí el compilador de Rust, rustc.
  • Se requiere acceso a internet para descargar los crates requeridos.
  • Se compilan todos los paquetes y se genera un ejecutable final en target/debug.

Ejecutar el programa

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in X.Ys
     Running `target/debug/mi_servidor_web`
  • La compilación y la ejecución son dos pasos separados.
  • Eso sí, cargo run ejecuta antes cargo build, por lo que bastará con usar el primero para compilar y ejecutar de una tacada.
  • También se puede ejecutar el programa directamente desde la línea de comandos.
  • Cargo no compilará de nuevo los crates del proyecto si no hay cambios en las dependencias o no se ha hecho limpieza de los ficheros generados ejecutando cargo clean.

Abrir un navegador con la URL 127.0.0.1:8088 para mostrar el saludo de Rust.

Compilar para producción

Finalizado el proyecto, listo para ser publicado, compilar con cargo build --release para aplicar las optimizaciones que dejan el ejecutable más rápido y compacto, aunque requerirá más tiempo de compilación.

Esta vez el ejecutable final queda en target/release.

Última revisión: 21/07/2020

0 comentarios

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *