598 lines
12 KiB
Markdown
598 lines
12 KiB
Markdown
---
|
|
description: Set up modern Rust development tooling (bacon, nextest, audit, deny, clippy config)
|
|
---
|
|
|
|
Set up a modern Rust development environment with best-in-class tooling for 2025.
|
|
|
|
## What This Command Does
|
|
|
|
This command configures your Rust project with:
|
|
|
|
1. **Essential Development Tools** - Install bacon, cargo-nextest, etc.
|
|
2. **Quality Assurance Tools** - Set up clippy, rustfmt, cargo-audit
|
|
3. **Security Tools** - Configure cargo-audit and cargo-deny
|
|
4. **Configuration Files** - Create clippy.toml, deny.toml, rustfmt.toml
|
|
5. **CI/CD Template** - Provide GitHub Actions workflow
|
|
6. **Documentation** - Add tool usage guide to project
|
|
|
|
## Process
|
|
|
|
### 1. Assess Current Setup
|
|
|
|
Check what's already installed:
|
|
|
|
```bash
|
|
# Check Rust version
|
|
rustc --version
|
|
rustup --version
|
|
|
|
# Check for existing tools
|
|
cargo-nextest --version 2>/dev/null
|
|
cargo-audit --version 2>/dev/null
|
|
cargo-deny --version 2>/dev/null
|
|
bacon --version 2>/dev/null
|
|
flamegraph --version 2>/dev/null
|
|
cargo-semver-checks --version 2>/dev/null
|
|
```
|
|
|
|
### 2. Install Essential Tools
|
|
|
|
Install missing tools with user confirmation:
|
|
|
|
```bash
|
|
echo "Installing modern Rust tooling..."
|
|
echo ""
|
|
echo "Essential tools:"
|
|
echo " • bacon - Background compiler"
|
|
echo " • cargo-nextest - Fast test runner"
|
|
echo " • cargo-audit - Security scanner"
|
|
echo " • cargo-deny - Dependency validator"
|
|
echo ""
|
|
echo "Optional tools:"
|
|
echo " • flamegraph - Performance profiler"
|
|
echo " • cargo-semver-checks - API compatibility"
|
|
echo " • cargo-machete - Unused dependency finder"
|
|
echo ""
|
|
|
|
# Install essentials
|
|
cargo install bacon
|
|
cargo install cargo-nextest
|
|
cargo install cargo-audit
|
|
cargo install cargo-deny
|
|
|
|
# Optionally install others
|
|
# cargo install flamegraph
|
|
# cargo install cargo-semver-checks
|
|
# cargo install cargo-machete
|
|
```
|
|
|
|
### 3. Create Configuration Files
|
|
|
|
#### clippy.toml
|
|
|
|
Create `clippy.toml` with sensible defaults:
|
|
|
|
```toml
|
|
# clippy.toml - Clippy linter configuration
|
|
# See: https://doc.rust-lang.org/clippy/
|
|
|
|
# Complexity thresholds
|
|
cognitive-complexity-threshold = 30
|
|
too-many-arguments-threshold = 7
|
|
too-many-lines-threshold = 150
|
|
large-error-threshold = 128
|
|
|
|
# Naming conventions
|
|
single-char-binding-names-threshold = 5
|
|
|
|
# Documentation
|
|
missing-docs-in-private-items = false
|
|
|
|
# Allow some pedantic lints that are too noisy
|
|
# Uncomment to allow:
|
|
# doc-markdown = "allow"
|
|
# module-name-repetitions = "allow"
|
|
# missing-errors-doc = "allow"
|
|
```
|
|
|
|
#### rustfmt.toml
|
|
|
|
Create `rustfmt.toml` for consistent formatting:
|
|
|
|
```toml
|
|
# rustfmt.toml - Rustfmt configuration
|
|
# See: https://rust-lang.github.io/rustfmt/
|
|
|
|
edition = "2024"
|
|
|
|
# Line length
|
|
max_width = 100
|
|
hard_tabs = false
|
|
tab_spaces = 4
|
|
|
|
# Imports
|
|
imports_granularity = "Crate"
|
|
group_imports = "StdExternalCrate"
|
|
reorder_imports = true
|
|
|
|
# Comments and docs
|
|
wrap_comments = true
|
|
format_code_in_doc_comments = true
|
|
normalize_comments = true
|
|
|
|
# Misc
|
|
use_field_init_shorthand = true
|
|
use_try_shorthand = true
|
|
```
|
|
|
|
#### deny.toml
|
|
|
|
Initialize cargo-deny configuration:
|
|
|
|
```bash
|
|
cargo deny init
|
|
```
|
|
|
|
Then customize the generated `deny.toml`:
|
|
|
|
```toml
|
|
# deny.toml - Cargo-deny configuration
|
|
|
|
[advisories]
|
|
vulnerability = "deny"
|
|
unmaintained = "warn"
|
|
unsound = "warn"
|
|
yanked = "warn"
|
|
notice = "warn"
|
|
|
|
[licenses]
|
|
unlicensed = "deny"
|
|
# Adjust allowed licenses for your needs
|
|
allow = [
|
|
"MIT",
|
|
"Apache-2.0",
|
|
"BSD-3-Clause",
|
|
"BSD-2-Clause",
|
|
"ISC",
|
|
]
|
|
confidence-threshold = 0.8
|
|
|
|
[bans]
|
|
multiple-versions = "warn"
|
|
wildcards = "warn"
|
|
highlight = "all"
|
|
|
|
# Ban known problematic crates (customize as needed)
|
|
deny = [
|
|
# Example: { name = "openssl", use-instead = "rustls" },
|
|
]
|
|
|
|
[sources]
|
|
unknown-registry = "deny"
|
|
unknown-git = "warn"
|
|
allow-registry = ["https://github.com/rust-lang/crates.io-index"]
|
|
```
|
|
|
|
#### .cargo/config.toml
|
|
|
|
Create `.cargo/config.toml` for local development settings:
|
|
|
|
```toml
|
|
# .cargo/config.toml - Cargo configuration
|
|
|
|
[alias]
|
|
# Convenient aliases
|
|
check-all = "check --all-targets --all-features"
|
|
test-all = "nextest run --all-features"
|
|
lint = "clippy --all-targets --all-features -- -D warnings"
|
|
quality = "run --bin rust-quality-check"
|
|
|
|
[build]
|
|
# Increase parallel compilation
|
|
jobs = 8 # Adjust based on CPU cores
|
|
|
|
[term]
|
|
# Better progress bars
|
|
progress.when = "auto"
|
|
progress.width = 80
|
|
```
|
|
|
|
### 4. Update Cargo.toml
|
|
|
|
Suggest updates to the project's `Cargo.toml`:
|
|
|
|
```toml
|
|
[package]
|
|
name = "my-project"
|
|
version = "0.1.0"
|
|
edition = "2024" # Use latest edition
|
|
rust-version = "1.85" # Set minimum Rust version (MSRV)
|
|
|
|
# Add lints
|
|
[lints.rust]
|
|
unsafe_code = "forbid" # Adjust as needed
|
|
missing_docs = "warn"
|
|
|
|
[lints.clippy]
|
|
all = "warn"
|
|
pedantic = "warn"
|
|
nursery = "warn"
|
|
cargo = "warn"
|
|
|
|
# Allow some pedantic lints that are too noisy
|
|
module_name_repetitions = "allow"
|
|
missing_errors_doc = "allow"
|
|
|
|
[profile.dev]
|
|
# Faster iterative compilation
|
|
opt-level = 1
|
|
|
|
[profile.release]
|
|
# Enable debug symbols for profiling
|
|
debug = true
|
|
lto = true
|
|
codegen-units = 1
|
|
```
|
|
|
|
### 5. Create Development Scripts
|
|
|
|
#### scripts/quality.sh
|
|
|
|
Create a pre-commit script:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# scripts/quality.sh - Run quality checks
|
|
|
|
set -e
|
|
|
|
echo "🔍 Running quality checks..."
|
|
echo ""
|
|
|
|
echo "📝 Formatting..."
|
|
cargo fmt --all -- --check
|
|
|
|
echo "✨ Linting..."
|
|
cargo clippy --all-targets --all-features -- -D warnings
|
|
|
|
echo "🧪 Testing..."
|
|
if command -v cargo-nextest &> /dev/null; then
|
|
cargo nextest run --all-features
|
|
cargo test --doc
|
|
else
|
|
cargo test --all-features
|
|
fi
|
|
|
|
echo "🔒 Security audit..."
|
|
cargo audit
|
|
|
|
echo "📦 Dependency check..."
|
|
if [ -f "deny.toml" ]; then
|
|
cargo deny check
|
|
fi
|
|
|
|
echo ""
|
|
echo "✅ All checks passed!"
|
|
```
|
|
|
|
Make it executable:
|
|
```bash
|
|
chmod +x scripts/quality.sh
|
|
```
|
|
|
|
#### scripts/dev.sh
|
|
|
|
Create a development startup script:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# scripts/dev.sh - Start development environment
|
|
|
|
echo "🚀 Starting Rust development environment..."
|
|
echo ""
|
|
|
|
# Start bacon in background
|
|
echo "Starting bacon clippy..."
|
|
bacon clippy &
|
|
BACON_PID=$!
|
|
|
|
# Trap Ctrl+C to clean up
|
|
trap "echo ''; echo 'Shutting down...'; kill $BACON_PID 2>/dev/null; exit" INT TERM
|
|
|
|
echo ""
|
|
echo "✅ Development environment ready!"
|
|
echo ""
|
|
echo " 📝 Bacon is running clippy in the background"
|
|
echo " 🔧 Make changes and see feedback automatically"
|
|
echo ""
|
|
echo "Press Ctrl+C to stop"
|
|
echo ""
|
|
|
|
# Keep script running
|
|
wait $BACON_PID
|
|
```
|
|
|
|
Make it executable:
|
|
```bash
|
|
chmod +x scripts/dev.sh
|
|
```
|
|
|
|
### 6. Create CI/CD Workflow
|
|
|
|
Create `.github/workflows/ci.yml`:
|
|
|
|
```yaml
|
|
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main, develop]
|
|
pull_request:
|
|
branches: [main, develop]
|
|
|
|
env:
|
|
CARGO_TERM_COLOR: always
|
|
RUSTFLAGS: -D warnings
|
|
|
|
jobs:
|
|
check:
|
|
name: Check
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install Rust
|
|
uses: dtolnay/rust-toolchain@stable
|
|
with:
|
|
components: rustfmt, clippy
|
|
|
|
- name: Cache dependencies
|
|
uses: Swatinem/rust-cache@v2
|
|
|
|
- name: Check formatting
|
|
run: cargo fmt --all -- --check
|
|
|
|
- name: Run clippy
|
|
run: cargo clippy --all-targets --all-features -- -D warnings
|
|
|
|
- name: Check cargo.toml
|
|
run: cargo check --all-features
|
|
|
|
test:
|
|
name: Test
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install Rust
|
|
uses: dtolnay/rust-toolchain@stable
|
|
|
|
- name: Cache dependencies
|
|
uses: Swatinem/rust-cache@v2
|
|
|
|
- name: Install nextest
|
|
uses: taiki-e/install-action@nextest
|
|
|
|
- name: Run tests
|
|
run: cargo nextest run --all-features
|
|
|
|
- name: Run doctests
|
|
run: cargo test --doc
|
|
|
|
security:
|
|
name: Security Audit
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install Rust
|
|
uses: dtolnay/rust-toolchain@stable
|
|
|
|
- name: Cache dependencies
|
|
uses: Swatinem/rust-cache@v2
|
|
|
|
- name: Install cargo-audit
|
|
run: cargo install cargo-audit
|
|
|
|
- name: Run security audit
|
|
run: cargo audit
|
|
|
|
- name: Install cargo-deny
|
|
run: cargo install cargo-deny
|
|
|
|
- name: Check dependencies
|
|
run: cargo deny check
|
|
|
|
coverage:
|
|
name: Code Coverage
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install Rust
|
|
uses: dtolnay/rust-toolchain@stable
|
|
|
|
- name: Install tarpaulin
|
|
run: cargo install cargo-tarpaulin
|
|
|
|
- name: Generate coverage
|
|
run: cargo tarpaulin --out xml --all-features
|
|
|
|
- name: Upload coverage
|
|
uses: codecov/codecov-action@v3
|
|
with:
|
|
files: ./cobertura.xml
|
|
```
|
|
|
|
### 7. Create Documentation
|
|
|
|
Create `DEVELOPMENT.md`:
|
|
|
|
```markdown
|
|
# Development Guide
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Rust 1.85 or later
|
|
- Modern Rust tooling (see setup below)
|
|
|
|
### Setup
|
|
|
|
Install development tools:
|
|
|
|
\`\`\`bash
|
|
./scripts/setup-tooling.sh # Or manually install tools
|
|
\`\`\`
|
|
|
|
### Development Workflow
|
|
|
|
Start the development environment:
|
|
|
|
\`\`\`bash
|
|
./scripts/dev.sh
|
|
\`\`\`
|
|
|
|
This starts bacon for continuous feedback. Make changes and see linting results automatically.
|
|
|
|
### Before Committing
|
|
|
|
Run quality checks:
|
|
|
|
\`\`\`bash
|
|
./scripts/quality.sh
|
|
# Or use the alias:
|
|
cargo quality
|
|
\`\`\`
|
|
|
|
This runs:
|
|
- Code formatting check
|
|
- Clippy linting
|
|
- All tests
|
|
- Security audit
|
|
- Dependency validation
|
|
|
|
## Tools
|
|
|
|
### bacon
|
|
Continuous background compilation and linting.
|
|
|
|
\`\`\`bash
|
|
bacon clippy # Run clippy continuously
|
|
bacon test # Run tests continuously
|
|
\`\`\`
|
|
|
|
### cargo-nextest
|
|
Faster test runner with better output.
|
|
|
|
\`\`\`bash
|
|
cargo nextest run # Run all tests
|
|
cargo nextest run test_name # Run specific test
|
|
\`\`\`
|
|
|
|
### cargo-audit
|
|
Security vulnerability scanner.
|
|
|
|
\`\`\`bash
|
|
cargo audit # Check for vulnerabilities
|
|
cargo audit fix # Update dependencies
|
|
\`\`\`
|
|
|
|
### cargo-deny
|
|
Dependency validator for licenses, sources, and security.
|
|
|
|
\`\`\`bash
|
|
cargo deny check # Check all policies
|
|
cargo deny check licenses # Check licenses only
|
|
\`\`\`
|
|
|
|
### flamegraph
|
|
Performance profiler.
|
|
|
|
\`\`\`bash
|
|
cargo flamegraph --bin myapp
|
|
\`\`\`
|
|
|
|
## Configuration
|
|
|
|
- `clippy.toml` - Clippy linting rules
|
|
- `rustfmt.toml` - Code formatting rules
|
|
- `deny.toml` - Dependency policies
|
|
- `.cargo/config.toml` - Cargo aliases and settings
|
|
|
|
## CI/CD
|
|
|
|
All checks run automatically in CI:
|
|
- Format checking
|
|
- Clippy linting
|
|
- Test suite
|
|
- Security audit
|
|
- Dependency validation
|
|
|
|
See `.github/workflows/ci.yml` for details.
|
|
\`\`\`
|
|
|
|
### 8. Provide Setup Summary
|
|
|
|
After completion, show summary:
|
|
|
|
```
|
|
✅ Rust Development Tooling Setup Complete!
|
|
|
|
Installed Tools:
|
|
✅ bacon - Background compiler
|
|
✅ cargo-nextest - Fast test runner
|
|
✅ cargo-audit - Security scanner
|
|
✅ cargo-deny - Dependency validator
|
|
|
|
Created Configurations:
|
|
✅ clippy.toml - Linting rules
|
|
✅ rustfmt.toml - Formatting rules
|
|
✅ deny.toml - Dependency policies
|
|
✅ .cargo/config.toml - Cargo settings
|
|
|
|
Created Scripts:
|
|
✅ scripts/quality.sh - Pre-commit checks
|
|
✅ scripts/dev.sh - Development environment
|
|
|
|
Created Workflows:
|
|
✅ .github/workflows/ci.yml - CI pipeline
|
|
|
|
Created Documentation:
|
|
✅ DEVELOPMENT.md - Developer guide
|
|
|
|
Next Steps:
|
|
1. Review and adjust configurations to your needs
|
|
2. Run: ./scripts/dev.sh
|
|
3. Make changes and see instant feedback
|
|
4. Before committing: ./scripts/quality.sh
|
|
|
|
Happy coding! 🦀✨
|
|
```
|
|
|
|
## Tool Descriptions
|
|
|
|
Explain each tool's purpose:
|
|
|
|
- **bacon**: Watches files and runs cargo commands, showing minimal, actionable output
|
|
- **cargo-nextest**: Runs tests in parallel with better reporting, 60% faster than cargo test
|
|
- **cargo-audit**: Scans dependencies for security vulnerabilities from RustSec database
|
|
- **cargo-deny**: Validates licenses, sources, and checks for banned/duplicated dependencies
|
|
- **cargo-semver-checks**: Ensures API changes follow semantic versioning (for libraries)
|
|
- **flamegraph**: Generates flamegraphs for performance profiling
|
|
|
|
## Your Task
|
|
|
|
Set up modern Rust development tooling:
|
|
|
|
1. Check current tool installation
|
|
2. Install missing essential tools
|
|
3. Create configuration files
|
|
4. Set up development scripts
|
|
5. Create CI/CD workflow
|
|
6. Generate documentation
|
|
7. Provide clear next steps
|
|
|
|
Make the setup smooth and explain what each tool does!
|