It's quite challenging to export secondary artifacts like tests and benchmark executables. Those kind of artifacts can be very valuable for different reasons:
- packing test executables in the contaier to run them later on a different platform
- comparing and analyzing assembly of performance benchmarks
For final artifacts we have target/(release|debug)/{crate-name}, but test and benchmark executables are containing
hash like target/release/deps/app-25de5d28a523d3c2. Moreover it changes every time compiler options are changed. For
this reason methods like find and cp doesn't work well for extracting such artifacts.
Thankfully, compiler provide service messages (cargo build --message-format=json) which allows to list all the
artifacts generated by the compiler.
$ cargo install cargo-export-
export all test binaries to
target/testsdirectory$ cargo export target/tests -- testUnder the hood this command will run
cargo test --no-run --message-format=jsonand copy all the generated binaries in thetarget/testsdirectory. -
export all benchmark binaries to
target/benchdirectory$ cargo export target/bench -- bench -
export all benchmark binaries to
target/benchdirectory and add postfix-mainto each executable$ cargo export target/bench -t main -- bench -
build and export benchmarks with a specific feature
$ cargo export target/bench -- bench --feature=my-feature -
build and export benchmarks using nightly
$ cargo +nightly export target/bench -- bench
You can use taiki-e/install-action@v2 to install cargo-export in your GitHub Actions workflow.
name: Test
jobs:
test:
runs-on: ubuntu-22.04
steps:
- uses: taiki-e/install-action@v2
with:
tool: cargo-export
- name: Export Tests
run: cargo export target/bench -- test