<h2>Introdução ao Cargo: O Coração do Rust</h2>
<p>Cargo é o gerenciador de pacotes e sistema de build oficial do Rust, responsável por compilar código, gerenciar dependências, executar testes e publicar bibliotecas. Se você vem de linguagens como Python (pip) ou JavaScript (npm), Cargo funciona de forma similar, mas com integração profunda na toolchain do Rust. Nesta aula, você aprenderá desde conceitos fundamentais até práticas avançadas que o tornarão capaz de gerenciar projetos profissionais com confiança.</p>
<h2>Estrutura do Projeto e Configuração Básica</h2>
<h3>Criando um Projeto</h3>
<p>Todo projeto Rust começa com Cargo. Use <code>cargo new</code> para gerar a estrutura padrão:</p>
<pre><code class="language-bash">cargo new meu_projeto
cd meu_projeto</code></pre>
<p>Isso cria uma estrutura como:</p>
<pre><code>meu_projeto/
├── Cargo.toml # Manifesto do projeto
├── Cargo.lock # Lock file (gerado automaticamente)
└── src/
└── main.rs # Ponto de entrada</code></pre>
<h3>O Arquivo Cargo.toml</h3>
<p>O <code>Cargo.toml</code> é um arquivo TOML que define metadados e dependências. Aqui está um exemplo real:</p>
<pre><code class="language-toml">[package]
name = "meu_projeto"
version = "0.1.0"
edition = "2021"
authors = ["seu_nome <seu_email@example.com>"]
[dependencies]
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.35", features = ["full"] }
reqwest = "0.11"
[dev-dependencies]
criterion = "0.5"
[[bin]]
name = "app"
path = "src/main.rs"
[profile.release]
opt-level = 3
lto = true</code></pre>
<p>Cada dependência pode especificar versão, features (características opcionais) e fonte personalizada. O <code>Cargo.lock</code> garante reprodutibilidade, fixando versões exatas usadas na última compilação bem-sucedida.</p>
<h2>Gerenciamento de Dependências</h2>
<h3>Adicionando e Atualizando Dependências</h3>
<p>Use <code>cargo add</code> para instalar pacotes diretamente:</p>
<pre><code class="language-bash">cargo add serde --features derive
cargo add tokio --features full</code></pre>
<p>Ou edite <code>Cargo.toml</code> manualmente. Para atualizar, execute:</p>
<pre><code class="language-bash">cargo update # Atualiza respeitando Cargo.toml
cargo update serde --precise 1.0.200 # Versão específica</code></pre>
<h3>Entendendo Versionamento Semântico</h3>
<p>Rust segue semver (Semantic Versioning). Na especificação <code>"1.2.3"</code>:</p>
<ul>
<li><code>"1.2.3"</code> — exatamente esta versão</li>
<li><code>"^1.2.3"</code> — compatível (1.2.3 até <2.0.0)</li>
<li><code>"~1.2"</code> — patch flexível (1.2.x até <1.3.0)</li>
<li><code>"*"</code> — qualquer versão (evite em produção)</li>
</ul>
<p>Exemplo prático em <code>Cargo.toml</code>:</p>
<pre><code class="language-toml">[dependencies]
serde = "1.0" # ^1.0 implícito
log = "~0.4" # 0.4.x apenas
uuid = { version = "1.0", optional = true }
[features]
with_uuid = ["uuid"] # Feature que ativa uuid</code></pre>
<h2>Sistema de Build e Compilação</h2>
<h3>Perfis de Compilação</h3>
<p>Cargo fornece perfis pré-configurados para diferentes cenários:</p>
<pre><code class="language-bash">cargo build # Debug (padrão, desenvolvimento)
cargo build --release # Release (otimizado, produção)
cargo build --profile custom # Perfil customizado</code></pre>
<p>O exemplo abaixo mostra um <code>Cargo.toml</code> com perfis personalizados:</p>
<pre><code class="language-toml">[profile.dev]
opt-level = 0 # Sem otimizações
debug = true # Informações de debug
[profile.release]
opt-level = 3 # Máxima otimização
lto = true # Link Time Optimization
codegen-units = 1 # Otimização agressiva (compilação mais lenta)
strip = true # Remove símbolos de debug
[profile.bench]
inherits = "release" # Herda configurações de release</code></pre>
<h3>Compilando e Executando</h3>
<pre><code class="language-bash">cargo build --release # Compila em release
cargo run # Compila (se necessário) e executa
cargo run --release -- arg1 arg2 # Executa com argumentos
cargo check # Verifica sem gerar binário</code></pre>
<h2>Testes, Documentação e Publicação</h2>
<h3>Executando Testes</h3>
<pre><code class="language-bash">cargo test # Executa todos os testes
cargo test --release # Em modo release
cargo test -- --nocapture # Mostra println! durante testes</code></pre>
<p>Exemplo de teste em Rust:</p>
<pre><code class="language-rust">// src/lib.rs
pub fn soma(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn testa_soma() {
assert_eq!(soma(2, 2), 4);
}
#[test]
#[should_panic]
fn testa_panic() {
panic!("Esta função deve falhar");
}
}</code></pre>
<h3>Documentação</h3>
<p>Gere documentação automática com comentários <code>///</code>:</p>
<pre><code class="language-rust">/// Calcula a soma de dois números.
///
/// # Exemplos
///
/// ```
/// let resultado = soma(2, 3);
/// assert_eq!(resultado, 5);
/// ```
pub fn soma(a: i32, b: i32) -> i32 {
a + b
}</code></pre>
<pre><code class="language-bash">cargo doc --open # Gera e abre documentação no navegador</code></pre>
<h3>Publicando no crates.io</h3>
<p>Para publicar sua biblioteca em https://crates.io, registre-se e obtenha um token. Depois:</p>
<pre><code class="language-bash">cargo login <seu_token>
cargo publish</code></pre>
<p>Seu <code>Cargo.toml</code> deve incluir descrição e licença:</p>
<pre><code class="language-toml">[package]
name = "minha_lib"
version = "0.1.0"
description = "Uma biblioteca incrível"
license = "MIT"
repository = "https://github.com/usuario/minha_lib"</code></pre>
<h2>Conclusão</h2>
<p>Dominado Cargo, você controla toda a ciclo de vida de projetos Rust: desde a criação até publicação. Os três pilares essenciais são: (1) <strong>Cargo.toml</strong> como fonte única de verdade sobre dependências e configuração, (2) <strong>gerenciamento de versões</strong> usando semver para evitar conflitos, e (3) <strong>perfis de build</strong> para otimizar conforme o contexto (desenvolvimento vs. produção). Pratique criando projetos pequenos e publique uma biblioteca para solidificar o aprendizado.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://doc.rust-lang.org/cargo/" target="_blank" rel="noopener noreferrer">The Cargo Book - Official Documentation</a></li>
<li><a href="https://doc.rust-lang.org/rust-by-example/crates.html" target="_blank" rel="noopener noreferrer">Rust by Example - Dependencies Section</a></li>
<li><a href="https://crates.io/" target="_blank" rel="noopener noreferrer">crates.io - The Rust Community Registry</a></li>
<li><a href="https://semver.org/" target="_blank" rel="noopener noreferrer">Semantic Versioning Specification</a></li>
<li><a href="https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-modules-and-paths.html" target="_blank" rel="noopener noreferrer">The Rust Programming Language Book - Chapter 7</a></li>
</ul>