wandres.dev
SETUP Y CARGO · rustup, cargo, edición 2024

Instalar Rust con rustup

rustup no es un instalador, es un gestor de toolchains. Stable y nightly conviviendo, componentes, targets de cross-compilación y por qué una sola herramienta gobierna todas tus versiones de Rust.

⏱ 13 min

No instalas “Rust”: instalas rustup, y rustup instala, actualiza y hace convivir tantas versiones del compilador como necesites. Entender esta distinción desde el primer minuto te ahorra el error clásico de instalar Rust desde el gestor de paquetes del sistema y quedarte atrapado en una versión de hace dos años.

🎯 Al terminar esta lección sabrás
  • Instalar la toolchain oficial con rustup.
  • Entender los tres canales: stable, beta y nightly.
  • Añadir componentes y targets de compilación.
  • Fijar la toolchain por proyecto de forma reproducible.

rustup: instalar de una vez

rustup es el instalador oficial y, sobre todo, el gestor de versiones. Una sola orden monta todo:

# la vía canónica (rustup.rs)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# comprueba lo instalado
rustc --version   # el compilador
cargo --version   # el gestor de paquetes y build
rustup --version  # el propio gestor de toolchains

rustup deja dos directorios clave: ~/.rustup (las toolchains) y ~/.cargo (el registro, la caché y los binarios en ~/.cargo/bin, que debe estar en tu PATH). Los ejecutables rustc y cargo que invocas son en realidad proxies de rustup: interceptan la llamada y la redirigen a la toolchain activa.

⚠️
No instales Rust desde apt o brew

El paquete rustc de tu distro suele ir muy por detrás y no te deja tener varias versiones ni cambiar de canal. Para desarrollo, rustup es la única opción sensata. Si ya instalaste Rust por el sistema, desinstálalo antes para evitar que dos rustc compitan en el PATH.

Los tres canales: el tren de releases

Rust se publica con un modelo de tren de tres vías que avanza cada seis semanas:

flowchart LR
N[nightly cada dia] --> B[beta seis semanas]
B --> S[stable seis semanas]
S --> V[version fijada 1.x]
  • stable: la vía de producción. Cada seis semanas sale una versión nueva (1.85, 1.86, …) con garantías de estabilidad: lo que compila hoy seguirá compilando.
  • beta: la próxima stable, en periodo de pruebas. Sirve para adelantarte a regresiones antes de que lleguen.
  • nightly: se compila cada noche desde master. Es la única que habilita features inestables tras un #![feature(...)]. Herramientas como Miri viven aquí.
rustup default stable            # canal por defecto
rustup toolchain install nightly # añade nightly sin quitar stable
rustup update                    # actualiza todas las toolchains
rustup toolchain list            # qué tienes instalado
cargo +nightly build             # usa nightly puntualmente con +canal

La edición 2024 exige stable 1.85 o superior; en 2026 el stable va por la serie 1.9x, así que cualquier instalación fresca la soporta de sobra.

El sufijo +canal funciona con cualquier proxy: cargo +nightly, rustc +beta, incluso cargo +1.85. Es la forma de invocar una toolchain concreta sin tocar tu default, ideal para comprobar si un fallo es una regresión introducida entre versiones.

Componentes y targets

Una toolchain es modular. Los componentes son piezas opcionales del mismo canal:

🎨

rustfmt

El formateador oficial. Se invoca con cargo fmt.

📎

clippy

El linter que enseña Rust idiomático, vía cargo clippy.

🧠

rust-analyzer

El servidor LSP que da inteligencia a tu editor.

📚

rust-src

El fuente de la librería estándar, que rust-analyzer y Miri necesitan.

rustup component add clippy rustfmt rust-analyzer rust-src

Los targets son plataformas para las que compilar. Tu host trae el suyo; para cross-compilar añades más:

rustup target add wasm32-unknown-unknown       # WebAssembly
rustup target add x86_64-unknown-linux-musl    # binario estático para Linux
rustup target add aarch64-apple-darwin         # Apple Silicon
cargo build --target wasm32-unknown-unknown

Un target se nombra con la tripleta arquitectura-vendor-sistema-abi. Añadir uno solo descarga la std precompilada para esa plataforma; el compilador ya sabe generar su código.

Al instalar una toolchain, rustup aplica un perfil que decide cuántos componentes trae de serie. Puedes ajustarlo y auditar tu instalación:

rustup set profile minimal   # solo rustc, cargo y std (ideal en CI)
rustup show                  # toolchain activa, componentes y targets
rustup which cargo           # a qué binario real apunta el proxy
rustup doc --std             # abre la doc de la std, sin conexión

Los perfiles van de minimal (lo justo para compilar) a complete (todo, incluido lo que a veces está roto en nightly); default es el término medio sensato para desarrollar a diario.

ℹ️
rustup funciona sin conexión

Una vez descargada, toda tu toolchain vive en ~/.rustup. rustup doc abre la documentación local en el navegador y cargo compila sin red mientras las dependencias ya estén en la caché de ~/.cargo. Útil en aviones y en runners de CI con cachés persistentes.

Fijar la toolchain por proyecto

La reproducibilidad exige que todo el equipo (y la CI) use la misma versión. Se declara en un archivo en la raíz del repo:

[toolchain]
channel = "1.90.0"
components = ["clippy", "rustfmt", "rust-analyzer"]
targets = ["wasm32-unknown-unknown"]

Al entrar en ese directorio, rustup instala y selecciona automáticamente esa toolchain. Nadie compila “con lo que tenga puesto”.

rustup es infraestructura, no un detalle

El error mental de quien viene de C o de Python es pensar que “el compilador” es una cosa única instalada en el sistema. En Rust, tener varias toolchains conviviendo no es un caso raro: es el flujo normal. Desarrollas en stable, verificas una regresión en beta, pruebas una feature experimental en nightly y compilas para tres plataformas distintas, todo desde el mismo directorio y sin virtualizar nada. Los proxies de rustup hacen que cargo signifique “el cargo correcto para este proyecto ahora mismo”, resolviendo el canal por override de directorio, luego por rust-toolchain.toml y por último por el default global, en ese orden. Interiorizar que la versión del compilador es un dato del proyecto —versionado, reproducible, explícito— y no del ordenador, es el primer hábito de ingeniería serio en Rust. Es lo que hace que “en mi máquina funciona” deje de existir como excusa.

⚔️ Monta y domina tu toolchain
  1. Instala Rust con rustup y confirma las versiones de rustc, cargo y rustup.
  2. Añade la toolchain nightly y ejecuta rustc +nightly --version sin cambiar tu default.
  3. Añade los componentes clippy, rustfmt y rust-analyzer.
  4. Añade el target wasm32-unknown-unknown y comprueba que aparece en rustup target list --installed.
  5. Crea un rust-toolchain.toml que fije el canal stable y ábrelo desde otro directorio para ver el cambio automático.