Skills rust-project-setup
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/anderskev/rust-project-setup" ~/.claude/skills/clawdbot-skills-rust-project-setup && rm -rf "$T"
manifest:
skills/anderskev/rust-project-setup/SKILL.mdsource content
Rust Project Setup
Step-by-step guidance for setting up new Rust projects with proper configuration, linting, and CI.
Quick Reference
| Topic | Reference |
|---|---|
| Cargo.toml configuration, profiles, dependencies | references/cargo-config.md |
| Workspace organization, member layout, shared deps | references/workspace-layout.md |
| GitHub Actions CI, caching, MSRV checks | references/ci-setup.md |
| Feature flags, conditional compilation, build scripts | references/features-conditional.md |
| no_std development, embedded targets, cross-compilation | references/no-std.md |
New Project Checklist
1. Create the Project
# Binary cargo init my-app # Library cargo init --lib my-lib # Workspace (create Cargo.toml manually) mkdir my-workspace && cd my-workspace
2. Configure Cargo.toml
Set edition, rust-version (MSRV), and metadata:
[package] name = "my-app" version = "0.1.0" edition = "2024" rust-version = "1.85"
3. Set Up Linting
Add clippy and rustfmt configuration:
# Cargo.toml [lints.clippy] all = { level = "deny", priority = 10 } pedantic = { level = "warn", priority = 3 } [lints.rust] future-incompatible = "warn" nonstandard_style = "deny" # unsafe_op_in_unsafe_fn is deny-by-default in edition 2024 — no need to set it
Edition 2024 lint defaults:
is deny by default. Unsafe operations insideunsafe_op_in_unsafe_fnrequire explicitunsafe fnblocks. Theunsafe {}keyword is reserved — usegenif needed as an identifier.r#gen
# rustfmt.toml edition = "2024" reorder_imports = true imports_granularity = "Crate" group_imports = "StdExternalCrate"
4. Configure Profiles
[profile.release] lto = true codegen-units = 1 strip = true
5. Set Up CI
Add GitHub Actions workflow for check, clippy, test, and fmt. See references/ci-setup.md.
6. Cargo.lock Policy
- Binaries: Commit
(reproducible builds)Cargo.lock - Libraries: Do NOT commit
(consumers resolve their own versions)Cargo.lock - Add to
for libraries:.gitignoreCargo.lock
7. Documentation Setup
For library crates, enable doc lints:
// src/lib.rs #![deny(missing_docs)]
Prefer
#[expect(lint)] over #[allow(lint)] for temporary suppressions — it warns when the suppression becomes unnecessary:
#[expect(dead_code, reason = "used in next PR")] fn upcoming_feature() {}
Workspace vs Single Crate
| Use | When |
|---|---|
| Single crate | Small project, CLI tool, simple library |
| Workspace | Multiple related crates, shared dependencies, separate compile targets |
Workspaces reduce compile times by sharing dependencies and build artifacts across members.
Project Structure
Binary
my-app/ Cargo.toml rustfmt.toml src/ main.rs lib.rs # separate logic from entry point tests/ integration_test.rs
Library
my-lib/ Cargo.toml rustfmt.toml src/ lib.rs module_a.rs module_b/ mod.rs types.rs tests/ api_test.rs examples/ basic_usage.rs
Workspace
my-workspace/ Cargo.toml # [workspace] definition rustfmt.toml # shared formatting crates/ core/ # shared types and logic api/ # HTTP server cli/ # command-line interface
Dependency Best Practices
- Pin exact versions for binaries:
serde = "=1.0.210" - Use version ranges for libraries:
serde = "1" - Group features explicitly:
tokio = { version = "1", features = ["rt-multi-thread", "macros"] } - Use
for test-only crates[dev-dependencies] - Review
for duplicate versionscargo tree - Run
for security vulnerabilitiescargo audit - Replace
/once_cell
withlazy_static
(stable since Rust 1.80)std::sync::LazyLock
Edition 2024 Migration Notes
When migrating existing projects to edition 2024:
bodies now require explicitunsafe fn
blocks around unsafe operationsunsafe {}
blocks must be written asextern "C" {}unsafe extern "C" {}
and#[no_mangle]
require#[export_name]
and#[unsafe(no_mangle)]#[unsafe(export_name)]
is a reserved keyword — rename anygen
identifiers togen
or choose a different namer#gen
captures all in-scope lifetimes by default; use-> impl Trait
for precise control+ use<'a>
(never type) falls back to!
instead of!
— review match arms and diverging expressions()- Temporaries in
and tail expressions drop earlier — review code holding locks or guards in these positionsif let
Run
cargo fix --edition to auto-fix most mechanical changes.
Related Skills
— idiomatic patterns and edition 2024 coding guidancebeagle-rust:rust-best-practices
— code review covering ownership, unsafe, and trait designbeagle-rust:rust-code-review