List and diff the public API of Rust library crates between releases and commits. Detect breaking API changes and semver violations. Relies on and automatically builds rustdoc JSON, for which a recent version of the Rust nightly toolchain must be installed.
# Install cargo-public-api with a recent regular stable Rust toolchain
cargo install cargo-public-api
# Ensure nightly-2022-09-28 or later is installed so cargo-public-api can build rustdoc JSON for you
rustup install nightly
This example lists the public API of the ubiquitous regex
crate. First we clone the repo:
git clone https://github.com/rust-lang/regex
cd regex
Now we can list the public API of regex
by running
cargo public-api
which will print the public API of regex
with one line per public item in the API:
To diff the API between say 0.2.2 and 0.2.3 of regex
, use --diff-git-checkouts 0.2.2 0.2.3
while standing in the git repo. Like this:
cargo public-api --diff-git-checkouts 0.2.2 0.2.3
and the API diff will be printed:
When you make changes to your library you often want to make sure that you do not accidentally change the public API of your library, or that the API change you are making looks like you expect. For this use case, first git commit your work in progress, and then run
cargo public-api --diff-git-checkouts origin/main your-current-branch
which will print the diff of your public API changes compared to origin/main
.
This tool can be put to good use in CI pipelines to e.g. help you make sure your public API is not unexpectedly changed. Please see CI-EXAMPLES.md for CI job configuration examples and use cases.
Before you cargo publish
a new version of your crate, you can diff the public API of your local code against the public API of the version you last published. Use the --diff-published
arg for that. Like this:
cargo public-api --diff-published [email protected]
Output aims to be character-by-character identical to the textual parts of the regular cargo doc
HTML output. For example, this item has the following textual representation in the rendered HTML:
pub fn input_files<I, P>(&mut self, paths: I) -> &mut Self
where
I: IntoIterator<Item = P>,
P: AsRef<Path>,
and cargo public-api
represents this item in the following manner:
pub fn bat::PrettyPrinter::input_files<I, P>(&mut self, paths: I) -> &mut Self where I: IntoIterator<Item = P>, P: AsRef<Path>
If we normalize by removing newline characters and adding some whitespace padding to get the alignment right for side-by-side comparison, we can see that they are exactly the same, except an irrelevant trailing comma:
pub fn input_files<I, P>(&mut self, paths: I) -> &mut Self where I: IntoIterator<Item = P>, P: AsRef<Path>,
pub fn bat::PrettyPrinter::input_files<I, P>(&mut self, paths: I) -> &mut Self where I: IntoIterator<Item = P>, P: AsRef<Path>
By default, items belonging to Blanket Implementations and Auto Trait Implementations such as impl<T> Borrow<T> for T
, impl<T, U> Into<U> for T where U: From<T>
, impl Send for Foo
and impl Sync for Foo
are included in the list of public items of a crate.
For casual uses of this tool, it can be helpful to omit such items from the output, as that makes the output much less noisy and repetitive. This is done with --simplified
:
cargo public-api --simplified
cargo-public-api | Understands the rustdoc JSON output of |
---|---|
0.20.x — 0.24.x | nightly-2022-09-28 — |
0.19.x | nightly-2022-09-08 — nightly-2022-09-27 |
0.18.x | nightly-2022-09-07 |
0.17.x | nightly-2022-09-06 |
0.15.x — 0.16.x | nightly-2022-08-15 — nightly-2022-09-05 |
0.13.x — 0.14.x | nightly-2022-08-10 — nightly-2022-08-14 |
0.12.x | nightly-2022-05-19 — nightly-2022-08-09 |
0.10.x — 0.11.x | nightly-2022-03-14 — nightly-2022-05-18 |
0.5.x — 0.9.x | nightly-2022-02-23 — nightly-2022-03-13 |
0.2.x — 0.3.x | nightly-2022-01-19 — nightly-2022-02-22 |
0.0.5 — 0.1.x | nightly-2021-10-11 — nightly-2022-01-18 |
See CONTRIBUTING.md.