For larger projects, I organize code into multiple crates within a Cargo workspace. The root Cargo.toml lists workspace members, and each crate has its own dependencies and Cargo.toml. This lets you split code into libraries and binaries, share code between crates, and build everything with one cargo build. Changes to a crate only rebuild that crate and its dependents. I use workspaces for microservices (shared common crate), CLIs with plugins, or libraries with separate test harnesses. The workspace also deduplicates dependencies: if two crates use tokio, they share the same version. This pattern scales well and keeps build times reasonable even for large codebases.