| name | rust-cargo-assistant |
| description | Cargo build system, crate management, and Rust project configuration assistance. |
Rust Cargo and Crate Management Skill
Cargo build system, crate management, and Rust project configuration assistance.
Instructions
You are a Rust and Cargo ecosystem expert. When invoked:
Cargo Management:
- Initialize and configure Cargo projects
- Manage Cargo.toml and Cargo.lock files
- Configure build profiles and features
- Handle workspace and multi-crate projects
- Use cargo commands effectively
Dependency Management:
- Add, update, and remove crates
- Handle feature flags and optional dependencies
- Use semantic versioning and version resolution
- Manage dev, build, and target-specific dependencies
- Work with path and git dependencies
Project Setup:
- Initialize libraries and binaries
- Configure project structure
- Set up testing and benchmarking
- Configure documentation
- Manage cross-compilation
Troubleshooting:
- Fix dependency resolution errors
- Debug compilation issues
- Handle version conflicts
- Clean build artifacts
- Resolve linker errors
Best Practices: Provide guidance on Rust project organization, crate publishing, and performance optimization
Cargo Basics
Project Initialization
# Create new binary project
cargo new my-project
# Create new library
cargo new --lib my-lib
# Create project with specific name
cargo new --name my_awesome_project my-project
# Initialize in existing directory
cargo init
# Initialize as library
cargo init --lib
# Project structure created:
# my-project/
# ├── Cargo.toml
# ├── .gitignore
# └── src/
# └── main.rs (or lib.rs for library)
Basic Commands
# Build project
cargo build
# Build with release optimizations
cargo build --release
# Run project
cargo run
# Run with arguments
cargo run -- arg1 arg2
# Run specific binary
cargo run --bin my-binary
# Check code (faster than build)
cargo check
# Run tests
cargo test
# Run benchmarks
cargo bench
# Generate documentation
cargo doc --open
# Format code
cargo fmt
# Lint code
cargo clippy
# Clean build artifacts
cargo clean
# Update dependencies
cargo update
# Search for crates
cargo search tokio
# Install binary
cargo install ripgrep
Usage Examples
@rust-cargo-assistant
@rust-cargo-assistant --init-project
@rust-cargo-assistant --add-dependencies
@rust-cargo-assistant --optimize-build
@rust-cargo-assistant --troubleshoot
@rust-cargo-assistant --publish-crate
Cargo.toml Configuration
Complete Example
[package]
name = "my-awesome-project"
version = "0.1.0"
edition = "2021"
authors = ["Your Name <email@example.com>"]
description = "A brief description of the project"
documentation = "https://docs.rs/my-awesome-project"
homepage = "https://github.com/user/my-awesome-project"
repository = "https://github.com/user/my-awesome-project"
readme = "README.md"
license = "MIT OR Apache-2.0"
keywords = ["cli", "tool", "utility"]
categories = ["command-line-utilities"]
rust-version = "1.74.0"
[dependencies]
# Regular dependencies
tokio = { version = "1.35", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
clap = { version = "4.4", features = ["derive"] }
# Optional dependencies (feature-gated)
redis = { version = "0.24", optional = true }
[dev-dependencies]
# Test and benchmark dependencies
criterion = "0.5"
mockall = "0.12"
proptest = "1.4"
[build-dependencies]
# Build script dependencies
cc = "1.0"
[features]
# Feature flags
default = ["json"]
json = ["serde_json"]
cache = ["redis"]
full = ["json", "cache"]
[[bin]]
# Binary configuration
name = "my-app"
path = "src/main.rs"
[lib]
# Library configuration
name = "my_lib"
path = "src/lib.rs"
crate-type = ["lib", "cdylib"] # For FFI
[profile.release]
# Release profile optimization
opt-level = 3
lto = true
codegen-units = 1
strip = true
[profile.dev]
# Development profile
opt-level = 0
debug = true
[workspace]
# Workspace configuration
members = ["crates/*", "examples/*"]
exclude = ["archived/*"]
Dependency Specification
[dependencies]
# Crates.io dependencies
serde = "1.0" # ^1.0.0 (latest 1.x)
tokio = "1.35.0" # ^1.35.0
regex = "~1.10.0" # >=1.10.0, <1.11.0
# Version operators
reqwest = ">= 0.11, < 0.13"
actix-web = "= 4.4.0" # Exact version
# Git dependencies
my-lib = { git = "https://github.com/user/my-lib" }
my-lib = { git = "https://github.com/user/my-lib", branch = "main" }
my-lib = { git = "https://github.com/user/my-lib", tag = "v1.0.0" }
my-lib = { git = "https://github.com/user/my-lib", rev = "abc123" }
# Path dependencies (local development)
my-local-lib = { path = "../my-local-lib" }
# Features
tokio = { version = "1.35", features = ["full"] }
serde = { version = "1.0", features = ["derive"], default-features = false }
# Optional dependencies
redis = { version = "0.24", optional = true }
# Renamed dependencies
web-framework = { package = "actix-web", version = "4.4" }
# Platform-specific dependencies
[target.'cfg(windows)'.dependencies]
winapi = "0.3"
[target.'cfg(unix)'.dependencies]
nix = "0.27"
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen = "0.2"
Project Structure Patterns
Binary Project
my-app/
├── Cargo.toml
├── Cargo.lock
├── src/
│ ├── main.rs
│ ├── lib.rs (optional)
│ ├── config.rs
│ └── utils.rs
├── tests/
│ └── integration_test.rs
├── benches/
│ └── benchmark.rs
├── examples/
│ └── example.rs
└── README.md
Library Project
my-lib/
├── Cargo.toml
├── src/
│ ├── lib.rs
│ ├── error.rs
│ └── types.rs
├── tests/
│ └── lib_test.rs
├── benches/
│ └── performance.rs
├── examples/
│ └── basic_usage.rs
└── README.md
Workspace Project
workspace/
├── Cargo.toml (workspace root)
├── crates/
│ ├── core/
│ │ ├── Cargo.toml
│ │ └── src/lib.rs
│ ├── api/
│ │ ├── Cargo.toml
│ │ └── src/lib.rs
│ └── cli/
│ ├── Cargo.toml
│ └── src/main.rs
├── examples/
│ └── demo/
│ ├── Cargo.toml
│ └── src/main.rs
└── README.md
# Workspace Cargo.toml
[workspace]
members = [
"crates/core",
"crates/api",
"crates/cli",
]
[workspace.package]
edition = "2021"
license = "MIT OR Apache-2.0"
rust-version = "1.74.0"
[workspace.dependencies]
# Shared dependency versions
tokio = { version = "1.35", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
Dependency Management
Adding Dependencies
# Add latest version
cargo add serde
# Add with features
cargo add tokio --features full
# Add dev dependency
cargo add --dev proptest
# Add build dependency
cargo add --build cc
# Add optional dependency
cargo add redis --optional
# Add from git
cargo add --git https://github.com/user/repo
# Add specific version
cargo add serde@1.0.193
Updating Dependencies
# Update all dependencies
cargo update
# Update specific dependency
cargo update serde
# Update to breaking version
cargo upgrade
# Check for outdated dependencies
cargo outdated
# Show dependency tree
cargo tree
# Show dependency tree for specific package
cargo tree -p tokio
# Show duplicate dependencies
cargo tree --duplicates
# Explain why dependency is included
cargo tree -i serde
Managing Features
[features]
default = ["std"]
std = []
async = ["tokio", "async-trait"]
serde = ["dep:serde", "dep:serde_json"]
full = ["std", "async", "serde"]
# Build with specific features
cargo build --features async
# Build with multiple features
cargo build --features "async,serde"
# Build with all features
cargo build --all-features
# Build with no default features
cargo build --no-default-features
# Build with no default but specific features
cargo build --no-default-features --features std
Build Profiles and Optimization
Profile Configuration
[profile.dev]
opt-level = 0 # No optimization
debug = true # Include debug info
split-debuginfo = "unpacked"
debug-assertions = true
overflow-checks = true
lto = false
panic = 'unwind'
incremental = true
codegen-units = 256
[profile.release]
opt-level = 3 # Maximum optimization
debug = false
strip = true # Strip symbols
lto = true # Link-time optimization
codegen-units = 1 # Better optimization
panic = 'abort' # Smaller binary
[profile.release-with-debug]
inherits = "release"
debug = true
strip = false
# Custom profile
[profile.production]
inherits = "release"
lto = "fat"
codegen-units = 1
opt-level = 3
# Build with specific profile
cargo build --profile production
# Release build
cargo build --release
# Development build (default)
cargo build
Size Optimization
[profile.release]
opt-level = "z" # Optimize for size
lto = true
codegen-units = 1
strip = true
panic = "abort"
[profile.release.package."*"]
opt-level = "z"
# Additional size reduction tools
cargo install cargo-bloat
# Show what's taking space
cargo bloat --release
# Show per-crate sizes
cargo bloat --release --crates
# Use UPX for compression
upx --best --lzma target/release/my-app
Testing and Benchmarking
Testing
// src/lib.rs
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_add() {
assert_eq!(add(2, 2), 4);
}
#[test]
#[should_panic]
fn test_panic() {
panic!("This test should panic");
}
#[test]
#[ignore]
fn expensive_test() {
// Long-running test
}
}
# Run all tests
cargo test
# Run specific test
cargo test test_add
# Run tests matching pattern
cargo test add
# Run ignored tests
cargo test -- --ignored
# Run with output
cargo test -- --nocapture
# Run tests in single thread
cargo test -- --test-threads=1
# Run doc tests
cargo test --doc
# Run integration tests
cargo test --test integration_test
Integration Tests
// tests/integration_test.rs
use my_lib::add;
#[test]
fn integration_test() {
assert_eq!(add(5, 5), 10);
}
Benchmarking with Criterion
[dev-dependencies]
criterion = "0.5"
[[bench]]
name = "my_benchmark"
harness = false
// benches/my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use my_lib::add;
fn benchmark_add(c: &mut Criterion) {
c.bench_function("add", |b| {
b.iter(|| add(black_box(5), black_box(5)))
});
}
criterion_group!(benches, benchmark_add);
criterion_main!(benches);
# Run benchmarks
cargo bench
# Run specific benchmark
cargo bench benchmark_add
# Save baseline
cargo bench -- --save-baseline main
# Compare to baseline
cargo bench -- --baseline main
Common Issues & Solutions
Issue: Linker Errors
# Error: linking with `cc` failed
# Solution: Install C compiler
# Ubuntu/Debian
sudo apt-get install build-essential
# macOS (install Xcode Command Line Tools)
xcode-select --install
# Windows (install Visual Studio Build Tools)
# Or use rustup:
rustup toolchain install stable-x86_64-pc-windows-gnu
Issue: Dependency Version Conflicts
# Check dependency tree
cargo tree
# See all versions of a package
cargo tree -i serde
# Force specific version in Cargo.toml
[dependencies]
serde = "=1.0.193" # Exact version
# Or use workspace to unify versions
[workspace.dependencies]
serde = "1.0"
Issue: Slow Compilation
# Use sccache for caching
cargo install sccache
export RUSTC_WRAPPER=sccache
# Add to Cargo.toml
[profile.dev]
incremental = true
# Use mold linker (Linux)
sudo apt install mold
export RUSTFLAGS="-C link-arg=-fuse-ld=mold"
# Or add to .cargo/config.toml
[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
# Reduce codegen units in dev
[profile.dev]
codegen-units = 128 # Default is 256
Issue: Cargo.lock Conflicts
# Regenerate lock file
rm Cargo.lock
cargo build
# Update specific dependency
cargo update -p serde
# For libraries: don't commit Cargo.lock
echo "Cargo.lock" >> .gitignore
# For binaries: always commit Cargo.lock
Issue: Out of Disk Space
# Clean build artifacts
cargo clean
# Clean all projects
cargo cache --autoclean
# Install cargo-cache
cargo install cargo-cache
# Clean registry cache
cargo cache -a
Cross-Compilation
Setup Target
# List installed targets
rustup target list --installed
# Add target
rustup target add x86_64-unknown-linux-musl
rustup target add x86_64-pc-windows-gnu
rustup target add aarch64-unknown-linux-gnu
# Build for target
cargo build --target x86_64-unknown-linux-musl
Cross-Compilation Configuration
# .cargo/config.toml
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
Using Cross
# Install cross
cargo install cross
# Build with cross
cross build --target x86_64-unknown-linux-musl
cross build --target aarch64-unknown-linux-gnu
# Cross supports many targets out of the box
cross build --target armv7-unknown-linux-gnueabihf
Publishing to Crates.io
Prepare for Publishing
[package]
name = "my-crate"
version = "0.1.0"
edition = "2021"
authors = ["Your Name <email@example.com>"]
description = "A brief description (required)"
license = "MIT OR Apache-2.0"
repository = "https://github.com/user/my-crate"
documentation = "https://docs.rs/my-crate"
homepage = "https://github.com/user/my-crate"
readme = "README.md"
keywords = ["cli", "tool"] # Max 5
categories = ["command-line-utilities"] # From crates.io list
# Exclude files from package
exclude = [
"tests/*",
"examples/*",
".github/*",
"*.sh",
]
# Or specify what to include
include = [
"src/**/*",
"Cargo.toml",
"README.md",
"LICENSE*",
]
Publishing Workflow
# Login to crates.io
cargo login <your-api-token>
# Check package before publishing
cargo package
# List files that will be published
cargo package --list
# Test package
cargo package --verify
# Publish (dry run first)
cargo publish --dry-run
# Publish for real
cargo publish
# Yank a version (remove from new dependencies)
cargo yank --vers 0.1.0
# Un-yank a version
cargo yank --vers 0.1.0 --undo
Versioning Strategy
# Update version
# In Cargo.toml, update version field
# Breaking changes (0.1.0 -> 1.0.0)
# Major version bump
# New features (1.0.0 -> 1.1.0)
# Minor version bump
# Bug fixes (1.1.0 -> 1.1.1)
# Patch version bump
# Pre-release versions
0.1.0-alpha.1
0.1.0-beta.1
0.1.0-rc.1
Useful Cargo Tools
cargo-edit
# Install
cargo install cargo-edit
# Add dependency
cargo add serde
# Remove dependency
cargo rm serde
# Upgrade dependencies
cargo upgrade
cargo-watch
# Install
cargo install cargo-watch
# Watch and rebuild on changes
cargo watch
# Watch and run tests
cargo watch -x test
# Watch and run
cargo watch -x run
# Clear screen on each run
cargo watch -c -x run
cargo-expand
# Install
cargo install cargo-expand
# Expand macros
cargo expand
# Expand specific module
cargo expand module::path
cargo-audit
# Install
cargo install cargo-audit
# Audit dependencies for security vulnerabilities
cargo audit
# Fix vulnerabilities
cargo audit fix
cargo-outdated
# Install
cargo install cargo-outdated
# Check for outdated dependencies
cargo outdated
# Show detailed information
cargo outdated -v
cargo-tarpaulin (Code Coverage)
# Install
cargo install cargo-tarpaulin
# Generate coverage report
cargo tarpaulin --out Html
# With verbose output
cargo tarpaulin --verbose --out Html
Advanced Cargo Features
Build Scripts
[package]
build = "build.rs"
[build-dependencies]
cc = "1.0"
// build.rs
fn main() {
// Compile C code
cc::Build::new()
.file("src/native/foo.c")
.compile("foo");
// Emit cargo directives
println!("cargo:rerun-if-changed=src/native/foo.c");
println!("cargo:rustc-link-lib=static=foo");
}
Cargo Aliases
# .cargo/config.toml
[alias]
b = "build"
c = "check"
t = "test"
r = "run"
rr = "run --release"
br = "build --release"
wr = "watch -x run"
# Use aliases
cargo b # Same as cargo build
cargo rr # Same as cargo run --release
Environment Variables
# Offline mode
cargo build --offline
# Custom registry
export CARGO_REGISTRY_DEFAULT=my-registry
# Custom target directory
export CARGO_TARGET_DIR=/tmp/cargo-target
# Additional rustc flags
export RUSTFLAGS="-C target-cpu=native"
# Build jobs
export CARGO_BUILD_JOBS=4
Best Practices Summary
Project Organization
- Use workspaces for multi-crate projects
- Keep src/ for source code
- Use tests/ for integration tests
- Use benches/ for benchmarks
- Use examples/ for usage examples
- Include comprehensive README.md
Dependency Management
- Use semantic versioning
- Commit Cargo.lock for binaries
- Don't commit Cargo.lock for libraries
- Minimize dependencies
- Use features for optional functionality
- Audit dependencies regularly
Performance
- Use release profile for production
- Enable LTO for smaller binaries
- Consider codegen-units = 1 for optimization
- Use cargo-bloat to analyze binary size
- Profile before optimizing
Testing
- Write unit tests in each module
- Write integration tests in tests/
- Use doc tests for examples
- Aim for high test coverage
- Run tests in CI/CD
Publishing
- Follow semver strictly
- Document breaking changes
- Include examples in documentation
- Choose appropriate keywords and categories
- Test package before publishing
- Maintain CHANGELOG.md
Quick Reference Commands
# Project management
cargo new <name> # Create new project
cargo init # Initialize in current dir
cargo build # Build project
cargo run # Build and run
cargo check # Check without building
# Dependencies
cargo add <crate> # Add dependency
cargo update # Update dependencies
cargo tree # Show dependency tree
# Testing and quality
cargo test # Run tests
cargo bench # Run benchmarks
cargo fmt # Format code
cargo clippy # Lint code
cargo doc --open # Generate and open docs
# Maintenance
cargo clean # Clean build artifacts
cargo publish # Publish to crates.io
cargo install <crate> # Install binary
# Advanced
cargo build --release # Optimized build
cargo build --target <target> # Cross-compile
cargo package # Create package for publishing
Notes
- Always commit Cargo.lock for binaries and applications
- Use workspaces to share dependencies across crates
- Enable LTO and optimize codegen-units for production
- Run cargo clippy regularly for better code quality
- Use cargo fmt to maintain consistent style
- Audit dependencies for security vulnerabilities
- Test on multiple platforms before releasing
- Follow semantic versioning strictly
- Document all public APIs thoroughly
- Use features for optional functionality