cargo-rake
A configuration-driven build tool that runs named targets declared in a
Rakefile.toml, in dependency order. It ships as both a cargo subcommand
(cargo rake) and a standalone rake binary.
Installation
The two binaries are distributed through different channels:
cargo-rake(thecargo rakesubcommand) — through cargo.rake(the standalone binary) — through system package managers.
cargo (cargo-rake)
Arch Linux (rake)
Available from the AUR in four mutually-exclusive flavors — pre-built or
built-from-source, each in a stable and a nightly unstable-feature variant:
Debian/Ubuntu and Fedora/RHEL (rake)
Download the .deb or .rpm for your architecture from the
latest release:
macOS (rake)
Rakefile.toml
A Rakefile.toml declares named targets. Each target owns an ordered array
of named commands plus an optional depends_on list:
[]
[[]]
= "compile"
= ["cargo", "build", "--all-features"]
[]
= ["build"]
[[]]
= "release"
= ["cargo", "build", "--release"]
[[]]
= "test"
= ["cargo", "test"]
= true
cmdis a program followed by its arguments. It is spawned directly — no shell is involved — so it behaves the same on every platform.[[target.<t>.command]]is a TOML array of tables. Each entry needs aname(a label used in--listoutput and error messages) and acmd. Commands run in array (declaration) order. (TOML table headers are absolute, so thetarget.<t>.commandprefix is required on each entry.)skip_on_error(per command, defaultfalse): whentrue, a non-zero exit from that command is tolerated and the target continues with its remaining commands instead of aborting.depends_onlists other targets that must run, in order, before this one.toolslists external tools (by name) the target needs; see below.
Tools
A target can declare external tools (cargo subcommands and the like) it depends
on. Tools are defined once in a top-level [tool.<name>] table and referenced
by name from a target's tools list:
[]
= "cargo-matrix" # crates.io name (for the update check)
= ["cargo-matrix", "--version"] # presence probe (zero exit = installed)
= ["cargo", "install", "cargo-matrix"] # run when missing or out of date
= false # default; see below
[]
= ["matrix"]
[[]]
= "clippy"
= ["cargo", "matrix", "clippy", "--all-targets", "--", "-Dwarnings"]
Before a target's commands run, each tool it references is ensured:
- The
checkcommand probes whether the tool is already installed: it must exit 0 when the tool is present. For a cargo subcommand this means["cargo", "<sub>", "--version"]— the barecargo-<sub>binary rejects--versionand exits non-zero, which would make the tool look perpetually absent. When absent,rakeprints anInstallingnotice and runsinstall. update(defaultfalse): whentrue, the installed version (parsed fromcheck's output) is compared against the latest reported by the tool'ssemver_checkmode and re-installed if a newer one exists. The only mode today is"crates-io"(the default), which queries the crates.io API and so needs acratename; a failed version check — or acheckwhose output has no parseable version — is non-fatal and keeps the installed version. Withupdate = false, the already-installed version is used as-is.- A failed
installaborts the run (unlike a tolerated command failure).
Each tool is ensured at most once per run, even when several targets reference it.
Execution
A target runs after its transitive dependencies. Within a target, commands run
in array order and execution stops at the first command that exits non-zero,
aborting the dependency chain — unless that command sets skip_on_error = true,
in which case the failure is tolerated and execution continues. The process
exits with the code of the command that stopped the run (or the last command if
all succeeded).
Usage
When no target is named, the default target runs.