Что такое Cargo
Cargo — менеджер пакетов и система сборки для Rust. Он управляет зависимостями, компиляцией, тестированием и публикацией.
▸Основные команды
1# Создание нового проекта2cargo new myproject3cargo new myproject --lib # Библиотека45# Сборка6cargo build7cargo build --release # Оптимизированная сборка89# Запуск10cargo run11cargo run -- --arg1 value1213# Тестирование14cargo test1516# Проверка (без создания бинарника)17cargo check1819# Документация20cargo doc --open2122# Форматирование23cargo fmt2425# Линтер26cargo clippy
Cargo.toml
▸Структура
1[package]2name = "myproject"3version = "0.1.0"4edition = "2021"5authors = ["John <john@example.com>"]6description = "A short description"7license = "MIT"8repository = "https://github.com/user/myproject"910[dependencies]11serde = { version = "1.0", features = ["derive"] }12tokio = { version = "1", features = ["full"] }13reqwest = "0.11"14anyhow = "1.0"1516[dev-dependencies]17criterion = { version = "0.5", features = ["html_reports"] }1819[build-dependencies]20cc = "1.0"2122[profile.release]23opt-level = 324lto = true25codegen-units = 1
▸Зависимости
1[dependencies]2# Простая версия3serde = "1.0"45# Конкретная версия6serde = "=1.0.152"78# Диапазон версий9serde = ">=1.0, <2.0"1011# С features12serde = { version = "1.0", features = ["derive"] }1314# Git dependency15serde = { git = "https://github.com/user/serde", branch = "main" }1617# Локальная зависимость18mylib = { path = "../mylib" }
Workspace
▸Определение workspace
1# Cargo.toml (корневой)2[workspace]3members = [4 "crates/core",5 "crates/api",6 "crates/cli",7]89[workspace.dependencies]10serde = { version = "1.0", features = ["derive"] }11tokio = { version = "1", features = ["full"] }
▸Использование workspace dependencies
1# crates/core/Cargo.toml2[dependencies]3serde.workspace = true4tokio.workspace = true
Features
▸Определение features
1[features]2default = ["json"]3json = ["dep:serde_json"]4xml = ["dep:quick-xml"]5full = ["json", "xml"]
▸Код с features
1#[cfg(feature = "json")]2pub mod json {3 use serde_json;4 // ...5}67#[cfg(feature = "xml")]8pub mod xml {9 use quick_xml;10 // ...11}
▸Использование features
1# С specific features2cargo build --features json34# Без default features5cargo build --no-default-features67# Со всеми features8cargo build --features full
Бенчмарки
1use criterion::{black_box, criterion_group, criterion_main, Criterion};23fn fibonacci(n: u64) -> u64 {4 match n {5 0 => 1,6 1 => 1,7 n => fibonacci(n - 1) + fibonacci(n - 2),8 }9}1011fn criterion_benchmark(c: &mut Criterion) {12 c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));13}1415criterion_group!(benches, criterion_benchmark);16criterion_main!(benches);
1# Запуск бенчмарков2cargo bench
Публикация крейтов
▸Подготовка к публикации
1# Проверка2cargo publish --dry-run34# Публикация5cargo login your-api-token6cargo publish
▸Настройка для публикации
1[package]2# ...3readme = "README.md"4keywords = ["web", "async", "http"]5categories = ["web-programming::http-server"]6exclude = [7 "tests/",8 "benches/",9 ".github/",10]
Build Scripts
▸build.rs
1use cc::Build;23fn main() {4 // Компиляция C-кода5 Build::new()6 .file("src/helper.c")7 .compile("helper");89 // Переменные окружения10 println!("cargo:rerun-if-changed=src/helper.c");11 println!("cargo:rustc-link-lib=static=helper");12}
Кросс-компиляция
1# Установка целевого модуля2rustup target add x86_64-unknown-linux-musl34# Кросс-компиляция5cargo build --target x86_64-unknown-linux-musl67# Использование cross8cargo install cross9cross build --target aarch64-unknown-linux-gnu
Профили сборки
1[profile.dev]2opt-level = 03debug = true45[profile.release]6opt-level = 37lto = true8codegen-units = 19panic = "abort"10strip = true
Best Practices
▸Структура проекта
1myproject/2├── Cargo.toml3├── build.rs4├── src/5│ ├── lib.rs6│ ├── main.rs7│ └── error.rs8├── tests/9├── benches/10├── examples/11└── .cargo/12 └── config.toml
▸clippy и fmt
1# Линтинг2cargo clippy -- -D warnings34# Форматирование5cargo fmt --check67# Безопасность8cargo audit
Заключение
Cargo — мощный инструмент для управления Rust-проектами. Workspace, features и профили сборки позволяют эффективно организовать крупные проекты. На собеседовании спрашивают про workspace, features, кросс-компиляцию и оптимизацию сборки.