Cargo Workflows

mohitmishra786/low-level-dev-skills/skills/rust/cargo-workflows

作者 mohitmishra786bdc58472fa9f无许可证253 个星标收录于 2026年10月9日更新于 2026年10月9日仓库3个月前更新

Cargo workflow skill for Rust projects. Use when managing workspaces, feature flags, build scripts, cargo cache, incremental builds, dependency auditing, or CI configuration with Cargo. Activates on queries about cargo workspaces, Cargo.toml features, build.rs, cargo nextest, cargo deny, cargo check vs build, or Cargo.lock management.

AI 生成的概览

指导代理处理 Rust 项目的 Cargo 工作区、特性标志、构建脚本、缓存、测试与依赖审计。

功能
该技能提供使用 Cargo 管理 Rust 项目的说明与配置示例,涵盖工作区设置、特性标志、build.rs 指令、增量构建与 CI 缓存、cargo nextest、使用 cargo-audit 和 cargo-deny 进行依赖审计,以及常用 cargo 命令。它产出的是指导与示例配置,而非可执行脚本。
适用场景
适用于设置或维护 Cargo 工作区、配置特性标志或构建脚本、在 CI 中加速 Cargo 构建,或审计 Rust 依赖。也适用于关于 cargo nextest、cargo deny、cargo check 与 build 的区别,或 Cargo.lock 管理的问题。
运行要求
不包含脚本,仅为说明性内容。按示例操作可能需要 Rust 工具链与 Cargo,以及 cargo-nextest、cargo-audit、cargo-deny、cargo-machete、cargo-expand、cargo-edit 等可选工具,并需要网络访问来安装它们。

Cargo Workflows

Purpose

Guide agents through Cargo workspaces, feature management, build scripts (build.rs), CI integration, incremental compilation, and the Cargo tool ecosystem.

Triggers

  • "How do I set up a Cargo workspace with multiple crates?"
  • "How do features work in Cargo?"
  • "How do I write a build.rs script?"
  • "How do I speed up Cargo builds in CI?"
  • "How do I audit my Rust dependencies?"
  • "What is cargo nextest and should I use it?"

Workflow

1. Workspace setup

text
my-project/├── Cargo.toml           # Workspace root├── Cargo.lock           # Single lock file for all members├── crates/│   ├── core/│   │   └── Cargo.toml│   ├── cli/│   │   └── Cargo.toml│   └── server/│       └── Cargo.toml└── tools/    └── codegen/        └── Cargo.toml
toml
# Workspace root Cargo.toml[workspace]members = [    "crates/core",    "crates/cli",    "crates/server",    "tools/codegen",]resolver = "2"   # Feature resolver v2 (required for edition 2021)
# Shared dependency versions (workspace.dependencies)[workspace.dependencies]serde = { version = "1", features = ["derive"] }tokio = { version = "1", features = ["full"] }anyhow = "1"
# Shared profile settings[profile.release]lto = "thin"codegen-units = 1
toml
# Member Cargo.toml[package]name = "myapp-core"version.workspace = trueedition.workspace = true
[dependencies]serde.workspace = true    # Inherit from workspaceanyhow.workspace = true

2. Feature flags

toml
[features]default = ["std"]
# Simple flagstd = []
# Feature that enables another featurefull = ["std", "async", "serde-support"]
# Feature with optional dependencyasync = ["dep:tokio"]serde-support = ["dep:serde", "serde/derive"]
[dependencies]tokio = { version = "1", optional = true }serde = { version = "1", optional = true }
bash
# Build with specific featurescargo build --features "async,serde-support"
# Build with no default featurescargo build --no-default-features
# Build with all featurescargo build --all-features
# Check feature combinationscargo check --no-default-featurescargo check --all-features

Feature gotchas:

  • Features are additive: once enabled anywhere in the dependency graph, they stay enabled
  • resolver = "2" prevents feature leakage between dev-dependencies and regular deps
  • Use dep:optional_dep syntax (edition 2021) to avoid implicit feature creation

3. Build scripts (build.rs)

rust
// build.rs (at crate root, runs before compilation)use std::env;use std::path::PathBuf;
fn main() {    // Re-run if these files change    println!("cargo:rerun-if-changed=build.rs");    println!("cargo:rerun-if-changed=wrapper.h");    println!("cargo:rerun-if-env-changed=MY_LIB_PATH");
    // Link a system library    println!("cargo:rustc-link-lib=mylib");    println!("cargo:rustc-link-search=/usr/local/lib");
    // Pass a cfg flag to Rust code    let target = env::var("TARGET").unwrap();    if target.contains("linux") {        println!("cargo:rustc-cfg=target_os_linux");    }
    // Set environment variable for downstream crates    println!("cargo:rustc-env=MY_GENERATED_VAR=value");
    // Generate bindings with bindgen    let bindings = bindgen::Builder::default()        .header("wrapper.h")        .generate()        .expect("Unable to generate bindings");
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());    bindings.write_to_file(out_path.join("bindings.rs")).unwrap();}
println! directiveEffect
cargo:rerun-if-changed=FILERe-run build script if file changes
cargo:rerun-if-env-changed=VARRe-run if env var changes
cargo:rustc-link-lib=NAMELink library
cargo:rustc-link-search=PATHAdd library search path
cargo:rustc-cfg=FLAGEnable #[cfg(FLAG)] in code
cargo:rustc-env=KEY=VALSet env!("KEY") at compile time
cargo:warning=MSGEmit build warning

4. Incremental builds and CI caching

yaml
# GitHub Actions with sccache- uses: Swatinem/rust-cache@v2  with:    cache-on-failure: true    shared-key: "release-build"
# Or manual cache- uses: actions/cache@v3  with:    path: |      ~/.cargo/registry/index/      ~/.cargo/registry/cache/      ~/.cargo/git/db/      target/    key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
bash
# Warm cache locallycargo fetch                    # Download all deps without buildingcargo build --tests            # Build everything including test bins
# Check if incremental hurts release builds (it often does)[profile.release]incremental = false            # Default; leave false for release

5. cargo nextest (faster test runner)

bash
# Installcargo install cargo-nextest
# Run tests (parallel by default, better output)cargo nextest run
# Run with specific filtercargo nextest run test_name_pattern
# List tests without runningcargo nextest list
# Use in CI (JUnit output)cargo nextest run --profile ci

nextest.toml:

toml
[profile.ci]fail-fast = falsetest-threads = "num-cpus"retries = { backoff = "exponential", count = 2, delay = "1s" }
[profile.default]test-threads = "num-cpus"

6. Dependency management and auditing

bash
# Check for security advisoriescargo install cargo-auditcargo audit
# Deny specific licenses, duplicates, advisoriescargo install cargo-denycargo deny check
# Check for unused dependenciescargo install cargo-machetecargo machete
# Update dependenciescargo update                    # Update to compatible versionscargo update -p serde           # Update single packagecargo upgrade                   # Update to latest (cargo-edit)

deny.toml:

toml
[licenses]allow = ["MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause"]deny = ["GPL-2.0", "AGPL-3.0"]
[bans]multiple-versions = "warn"deny = [{ name = "openssl", reason = "Use rustls instead" }]
[advisories]ignore = []  # List advisory IDs to ignore

7. Useful cargo commands

bash
# Build only specific binarycargo build --bin myapp
# Build only specific examplecargo build --example myexample
# Run with argumentscargo run -- --flag arg1 arg2
# Expand macros (for debugging proc macros)cargo install cargo-expandcargo expand module::path
# Tree of dependenciescargo treecargo tree --duplicates      # Show crates with multiple versionscargo tree -i serde          # Who depends on serde?
# Cargo.toml metadatacargo metadata --format-version 1 | jq '.packages[].name'

For workspace patterns and dependency resolution details, see references/workspace-patterns.md [blocked].

Related skills

  • Use skills/rust/rustc-basics for compiler flags and profile configuration
  • Use skills/rust/rust-debugging for debugging Cargo-built binaries
  • Use skills/rust/rust-ffi for build.rs with C library bindings
  • Use skills/build-systems/cmake when integrating Rust into a CMake build

来源与署名

来源:mohitmishra786/low-level-dev-skills位于skills/rust/cargo-workflows提交bdc5847

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架