Rustup: O Gerenciador de Toolchains do Rust

Guia completo do Rustup para gerenciar instalações do Rust. Aprenda sobre canais stable/beta/nightly, cross-compilation, componentes e configuração por projeto.

O Rustup é o instalador oficial e gerenciador de toolchains do Rust. Ele permite instalar, atualizar e alternar entre diferentes versões do compilador Rust, gerenciar targets de cross-compilation e instalar componentes adicionais como o rust-analyzer, clippy e rustfmt.

Se o Cargo é o coração do ecossistema Rust, o Rustup é o alicerce — ele garante que você sempre tenha a versão certa do compilador para cada projeto, facilitando trabalhar com código que requer nightly, compilar para diferentes plataformas ou manter múltiplas versões do Rust instaladas simultaneamente.

Neste guia, vamos cobrir desde a instalação inicial até cenários avançados como cross-compilation e gerenciamento de múltiplos toolchains.

Instalação

Instalando o Rustup

# Linux e macOS
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Windows (PowerShell)
# Baixe e execute rustup-init.exe de https://rustup.rs

# Instalação não-interativa (ideal para CI)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

# Verificar instalação
rustup --version
# rustup 1.27.0 (bbb9276d2 2024-03-08)

rustc --version
# rustc 1.77.0 (aedd173a2 2024-03-17)

Após a instalação, adicione o diretório ao PATH (normalmente feito automaticamente):

# Adicionar ao ~/.bashrc, ~/.zshrc ou equivalente
source "$HOME/.cargo/env"

# Ou manualmente
export PATH="$HOME/.cargo/bin:$PATH"

Desinstalando

# Remover completamente o Rust e o Rustup
rustup self uninstall

Uso Básico

Gerenciando Canais (Channels)

O Rust possui três canais de release:

  • stable: Versão estável, lançada a cada 6 semanas
  • beta: Próxima versão estável, para testes
  • nightly: Versão diária com features experimentais
# Instalar toolchains
rustup install stable
rustup install beta
rustup install nightly

# Instalar uma versão específica
rustup install 1.75.0
rustup install nightly-2024-03-01

# Definir o toolchain padrão
rustup default stable
rustup default nightly

# Ver toolchains instaladas
rustup toolchain list
# stable-x86_64-unknown-linux-gnu (default)
# beta-x86_64-unknown-linux-gnu
# nightly-x86_64-unknown-linux-gnu

# Executar um comando com toolchain específica
rustup run nightly cargo build
rustup run beta rustc --version

# Atalho com +
cargo +nightly build
cargo +beta test
rustc +nightly --version

Atualizando Toolchains

# Atualizar todas as toolchains instaladas
rustup update

# Atualizar apenas uma toolchain
rustup update stable
rustup update nightly

# Ver informações sobre a versão atual
rustup show
# Default host: x86_64-unknown-linux-gnu
# rustup home:  /home/usuario/.rustup
#
# installed toolchains
# --------------------
# stable-x86_64-unknown-linux-gnu (default)
# nightly-x86_64-unknown-linux-gnu
#
# active toolchain
# ----------------
# stable-x86_64-unknown-linux-gnu (default)
# rustc 1.77.0 (aedd173a2 2024-03-17)

# Verificar se há atualizações disponíveis
rustup check

Removendo Toolchains

# Remover uma toolchain
rustup toolchain uninstall nightly
rustup toolchain uninstall 1.70.0

# Listar e remover toolchains antigas
rustup toolchain list
rustup toolchain uninstall nightly-2024-01-01

Recursos Avançados

Componentes

Componentes são partes opcionais de uma toolchain:

# Listar componentes disponíveis
rustup component list

# Listar componentes instalados
rustup component list --installed
# cargo-x86_64-unknown-linux-gnu
# clippy-x86_64-unknown-linux-gnu
# rust-docs-x86_64-unknown-linux-gnu
# rust-std-x86_64-unknown-linux-gnu
# rustc-x86_64-unknown-linux-gnu
# rustfmt-x86_64-unknown-linux-gnu

# Instalar componentes essenciais
rustup component add rust-analyzer    # LSP server para IDEs
rustup component add rust-src         # Código fonte da stdlib
rustup component add clippy           # Linter (normalmente já incluso)
rustup component add rustfmt          # Formatador (normalmente já incluso)
rustup component add llvm-tools       # Ferramentas LLVM (profiling, coverage)
rustup component add miri             # Interpretador para detectar UB (nightly)

# Instalar componente para toolchain específica
rustup component add rust-src --toolchain nightly
rustup component add miri --toolchain nightly

# Remover componente
rustup component remove rust-docs

Componentes mais importantes:

ComponenteDescriçãoUso
clippyLinter oficialAnálise estática de código
rustfmtFormatadorFormatação consistente
rust-analyzerLSP serverIntegração com editores
rust-srcCódigo fonte stdlibNavegação em IDEs, Miri
llvm-toolsFerramentas LLVMCoverage, profiling
miriInterpretadorDetecção de undefined behavior
rust-docsDocumentação offlineReferência local

Override por Projeto (rust-toolchain.toml)

O arquivo rust-toolchain.toml na raiz do projeto define qual toolchain usar:

# rust-toolchain.toml
[toolchain]
channel = "1.75.0"
components = ["rust-src", "rust-analyzer", "clippy", "rustfmt"]
targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
profile = "default"

Exemplos de configuração:

# Projeto que requer nightly (ex: para features experimentais)
[toolchain]
channel = "nightly-2024-03-01"
components = ["rust-src", "clippy", "rustfmt"]

# Projeto com versão mínima fixa
[toolchain]
channel = "1.70.0"
components = ["clippy", "rustfmt"]

# Projeto WASM
[toolchain]
channel = "stable"
targets = ["wasm32-unknown-unknown"]
components = ["rust-src"]

Override via linha de comando:

# Override por diretório
rustup override set nightly
rustup override set 1.75.0

# Ver overrides ativos
rustup override list
# /home/usuario/projeto-x    nightly-x86_64-unknown-linux-gnu

# Remover override
rustup override unset
rustup override unset --path /home/usuario/projeto-x

Cross-Compilation

Cross-compilation permite compilar para plataformas diferentes da máquina host:

# Listar todos os targets disponíveis
rustup target list

# Listar targets instalados
rustup target list --installed

# Adicionar targets comuns
rustup target add x86_64-unknown-linux-musl      # Linux com musl (binários estáticos)
rustup target add aarch64-unknown-linux-gnu       # Linux ARM64
rustup target add x86_64-pc-windows-gnu           # Windows (GNU)
rustup target add x86_64-pc-windows-msvc          # Windows (MSVC)
rustup target add x86_64-apple-darwin             # macOS Intel
rustup target add aarch64-apple-darwin            # macOS Apple Silicon
rustup target add wasm32-unknown-unknown          # WebAssembly
rustup target add wasm32-wasi                     # WASM com WASI
rustup target add aarch64-linux-android           # Android ARM64
rustup target add armv7-unknown-linux-gnueabihf   # Raspberry Pi

# Adicionar target para toolchain específica
rustup target add wasm32-unknown-unknown --toolchain nightly

# Remover target
rustup target remove aarch64-linux-android

Compilando para outro target:

# Compilar para Linux com musl (binários estáticos)
cargo build --target x86_64-unknown-linux-musl --release

# Compilar para WebAssembly
cargo build --target wasm32-unknown-unknown --release

# Compilar para Windows a partir do Linux
cargo build --target x86_64-pc-windows-gnu --release

# Compilar para ARM64 (ex: Raspberry Pi 4, AWS Graviton)
cargo build --target aarch64-unknown-linux-gnu --release

Configuração de cross-compilation no .cargo/config.toml:

# .cargo/config.toml

# Configurar linker para targets específicos
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"

[target.x86_64-pc-windows-gnu]
linker = "x86_64-w64-mingw32-gcc"

# Compilar sempre para um target específico
[build]
target = "x86_64-unknown-linux-musl"

Usando cross para cross-compilation simplificada:

# Instalar cross (usa Docker para cross-compilation)
cargo install cross

# Compilar para ARM64 sem configurar toolchain manualmente
cross build --target aarch64-unknown-linux-gnu --release

# Testar em outra arquitetura via emulação
cross test --target aarch64-unknown-linux-gnu

Profiles

Profiles controlam quais componentes são instalados por padrão:

# Listar profiles disponíveis
# minimal: rustc, rust-std, cargo
# default: minimal + clippy, rustfmt, rust-docs
# complete: todos os componentes

# Definir profile
rustup set profile minimal   # CI/CD
rustup set profile default   # Desenvolvimento
rustup set profile complete  # Tudo disponível

Proxies e Ferramentas

O Rustup instala proxies que redirecionam para a toolchain ativa:

# Ferramentas disponíveis via proxy
rustc      # Compilador Rust
cargo      # Gerenciador de pacotes
rustdoc    # Gerador de documentação
rust-gdb   # Debugger GDB para Rust
rust-lldb  # Debugger LLDB para Rust
rustfmt    # Formatador
cargo-fmt  # Formatador via Cargo
clippy-driver  # Driver do Clippy
cargo-clippy   # Clippy via Cargo

Boas Práticas

1. Use rust-toolchain.toml em Todo Projeto

# rust-toolchain.toml
# Garante que todos os desenvolvedores usam a mesma versão
[toolchain]
channel = "1.75.0"
components = ["clippy", "rustfmt", "rust-analyzer"]

2. Mantenha Toolchains Atualizadas

# Atualize regularmente
rustup update

# Crie um alias para atualizar tudo
# No ~/.bashrc ou ~/.zshrc:
alias rust-update='rustup update && cargo install-update -a'

3. Use minimal Profile para CI

# No CI, instale apenas o necessário
rustup set profile minimal
rustup install stable
rustup component add clippy rustfmt

4. Limpe Toolchains Não Utilizadas

# Verificar espaço usado
du -sh ~/.rustup/

# Listar e remover toolchains antigas
rustup toolchain list
rustup toolchain uninstall nightly-2024-01-01

# Remover targets não usados
rustup target list --installed
rustup target remove aarch64-linux-android

5. Configure rust-analyzer Corretamente

// .vscode/settings.json
{
    "rust-analyzer.check.command": "clippy",
    "rust-analyzer.cargo.features": "all",
    "rust-analyzer.procMacro.enable": true,
    "rust-analyzer.imports.granularity.group": "module"
}

Exemplos Práticos

Exemplo 1: Setup Completo para Desenvolvimento

#!/bin/bash
# setup-rust.sh - Script de setup para novos desenvolvedores

set -euo pipefail

echo "=== Instalando Rust via Rustup ==="
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"

echo "=== Configurando toolchain ==="
rustup default stable
rustup component add rust-analyzer rust-src clippy rustfmt

echo "=== Instalando targets para cross-compilation ==="
rustup target add wasm32-unknown-unknown
rustup target add x86_64-unknown-linux-musl

echo "=== Instalando nightly (para cargo-expand e miri) ==="
rustup install nightly
rustup component add miri rust-src --toolchain nightly

echo "=== Instalando ferramentas essenciais ==="
cargo install cargo-watch
cargo install cargo-expand
cargo install cargo-audit
cargo install cargo-nextest
cargo install cargo-deny

echo "=== Verificação ==="
rustc --version
cargo --version
rustup show

echo "=== Setup concluído! ==="

Exemplo 2: Configuração de CI/CD

# .github/workflows/ci.yml
name: CI

on: [push, pull_request]

jobs:
  test-stable:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt
      - uses: Swatinem/rust-cache@v2
      - run: cargo fmt --check
      - run: cargo clippy --all-targets -- -D warnings
      - run: cargo test --all-features

  test-nightly:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
      - uses: Swatinem/rust-cache@v2
      - run: cargo test --all-features

  test-msrv:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: "1.70.0"  # MSRV do projeto
      - uses: Swatinem/rust-cache@v2
      - run: cargo test --all-features

  cross-compile:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target:
          - x86_64-unknown-linux-musl
          - aarch64-unknown-linux-gnu
          - wasm32-unknown-unknown
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}
      - run: cargo build --target ${{ matrix.target }} --release

Exemplo 3: Projeto com Nightly Features

# rust-toolchain.toml para projeto que precisa de nightly
[toolchain]
channel = "nightly-2024-03-01"
components = ["rust-src", "clippy", "rustfmt", "miri"]
// src/main.rs
// Ativar features experimentais do nightly
#![feature(let_chains)]
#![feature(async_closure)]

use std::collections::HashMap;

fn processar_dados(dados: &HashMap<String, Option<Vec<i32>>>) {
    for (chave, valor) in dados {
        // let chains - feature do nightly
        if let Some(numeros) = valor
            && !numeros.is_empty()
        {
            let soma: i32 = numeros.iter().sum();
            println!("{chave}: soma = {soma}, quantidade = {}", numeros.len());
        }
    }
}

fn main() {
    let mut dados = HashMap::new();
    dados.insert("vendas".to_string(), Some(vec![100, 200, 300]));
    dados.insert("custos".to_string(), Some(vec![50, 75]));
    dados.insert("vazio".to_string(), None);

    processar_dados(&dados);
}

Exemplo 4: Usando Miri para Detectar Undefined Behavior

# Instalar Miri no nightly
rustup component add miri --toolchain nightly

# Executar testes com Miri
cargo +nightly miri test

# Executar binário com Miri
cargo +nightly miri run

# Miri com configurações específicas
MIRIFLAGS="-Zmiri-disable-isolation" cargo +nightly miri test
// src/lib.rs - Miri detecta este tipo de bug

#[cfg(test)]
mod tests {
    #[test]
    fn teste_seguro() {
        // Miri verifica que este código é seguro
        let mut vec = vec![1, 2, 3];
        let primeiro = &vec[0];
        println!("Primeiro: {}", primeiro);
        // Não modifica vec enquanto primeiro está emprestado
        drop(primeiro);
        vec.push(4);
        assert_eq!(vec.len(), 4);
    }

    #[test]
    fn teste_com_raw_pointers() {
        // Miri verifica operações com ponteiros raw
        let mut x = 42;
        let ptr = &mut x as *mut i32;
        unsafe {
            *ptr = 100;
            assert_eq!(*ptr, 100);
        }
    }
}

Comparação com Alternativas

CaracterísticaRustupnvm (Node.js)pyenv (Python)sdkman (Java)
InstalaçãoOficialComunidadeComunidadeComunidade
Cross-compilationIntegradoN/AN/AN/A
ComponentesGerenciadosN/AN/AParcial
Canais (stable/nightly)IntegradoN/AN/AN/A
Override por projetorust-toolchain.toml.nvmrc.python-version.sdkmanrc
Múltiplas versõesSimSimSimSim
Gestão de ferramentasCargo installnpm -gpip installsdk install
Profilesminimal/default/completeN/AN/AN/A
PlataformasLinux, macOS, WindowsLinux, macOSLinux, macOSLinux, macOS
Integração IDEExcelenteBoaBoaBoa

O Rustup se destaca pela integração nativa com o ecossistema Rust, suporte a cross-compilation e gerenciamento de componentes — funcionalidades que são únicas entre gerenciadores de versão de linguagens.

Conclusão

O Rustup é uma ferramenta essencial que todo desenvolvedor Rust deve dominar. Ele simplifica enormemente o gerenciamento de versões do compilador, targets de cross-compilation e componentes adicionais.

Pontos-chave para lembrar:

  • rust-toolchain.toml garante consistência entre desenvolvedores
  • Canais (stable, beta, nightly) dão acesso a diferentes estágios do Rust
  • Cross-compilation com targets permite compilar para qualquer plataforma
  • Componentes como rust-analyzer e miri são instalados via rustup
  • Profiles otimizam a instalação para desenvolvimento ou CI

Para mais informações, consulte a documentação oficial do Rustup e o Rust Forge para calendário de releases.

No próximo passo, aprenda sobre o Clippy para melhorar a qualidade do seu código Rust.