How can I build multiple binaries with Cargo?
Solution 1:
You can specify multiple binaries using [[bin]]
, as mentioned here:
[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"
[[bin]]
name = "client"
path = "src/client/bin/main.rs"
Tip: If you instead put these files in src/bin/daemon.rs
and src/bin/client.rs
, you'll get two executables named daemon
and client
as Cargo compiles all files in src/bin
into executables with the same name automatically. You need to specify names and paths like in the snippet above only if you don't follow this convention.
Solution 2:
Another way is to use the workspace feature. This will provide more flexibility due to the fact that we can have more than one library. Example project structure:
.
├── Cargo.toml
├── cli
│ ├── Cargo.toml
│ └── src
│ └── main.rs
├── core
│ ├── Cargo.toml
│ └── src
│ └── lib.rs
├── daemon
│ ├── Cargo.toml
│ └── src
│ └── main.rs
├── gui
│ ├── Cargo.toml
│ └── src
│ └── main.rs
└── rpc
├── Cargo.toml
└── src
└── lib.rs
Contents of the root Cargo.toml
:
[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
Solution 3:
Another format could be to replicate what the Crates.io source code has done, if you have a massive project, something like:
Main Library in src, with a Bin folder with your executables. Then make calls to your main library crate from your executables.
That way you library is centralized so easier to find things as it's cached.