Target directories are like GBs in size, and some times I want to build the binaries and ignore everything else. I know I can pick the binaries, but for some projects there are many targets and it could be tedious. Is there a way in cargo to clean and keep all the executables that are bound to some --bin
in a workspace?
Never tried it myself, but can't you run cargo install --root my_binaries --path .
to build all [[bin]]
targets in the workspace and copy each binary to the ./my_binaries/bin
folder?
I'm not sure I understand how this works. When I try this (whether in the workspace root or some bin crate root in the workspace) I get the error: error: no packages found with binaries or examples
.
The command is broken down like so:
cargo install
compiles one or more binary crates in release mode--root my_binaries
means the resulting binary will end up in the./my_binaries
directory--path .
is the path to the directory containing aCargo.toml
. If you have just runcargo build
and that worked, then this is.
(the current dir)
I think the only reason it would say that is if your current package doesn't have a bin crate, so not sure what's up with that.
Also, what does this mean?
Indeed, I researched a bit and cargo install
is currently not supported for workspaces: #4101, #7124.
I don't know why the command doesn't work when executed in your member crates with binary targets present as this should definitely work.
As a quick and dirty hack around not being able to run cargo install
in a workspace, here a little bash script that installs every binary from your workspace. It requires you to have the toml-cli
tool present which can be installed by running cargo install toml-cli
. If you have library crates this will print ugly errors to your console but it installs every binary into the workspace/bin
directory nonetheless (at least locally when I tested it in a dummy workspace):
#!/bin/bash
# make sure workspace/bin directory is present
mkdir -p bin
# retrieve the member crates from the workspace manifest
IFS="," read -r -a MEMBERS <<< "$(toml get Cargo.toml workspace.members | sed 's/\"//g;s/\[//g;s/\]//g')"
# in case that the workspace is not virtual, try installing it
cargo install --path . --root .
# try installing member crates
for member in ${MEMBERS[@]}; do
cargo install --path $member --root .
done
I'd recommend looking into tools like cargo dist
that create distributable packages from your binaries
Thank you for your great effort, really, though I was hoping I wouldn't have to use custom scripts... otherwise I could do it myself ... I was hoping cargo can at least clean unused link files and stuff.
Thanks for the hint. Even though cargo dist
isn't really what I was looking for, but seems like an awesome little tool.