Track and query Cargo dependency graphs.
This repository contains the source code for:
guppy
: a library for performing queries on Cargo dependency graphs
guppy-summaries
: a library for managing build summaries listing packages and features
target-spec
: an evaluator for Cargo.toml
target specifications
determinator
: figure out what packages changed between two revisions
cargo-hakari
: a command-line tool to manage workspace-hack packages
hakari
cargo-guppy
: an experimental command-line frontend for guppy
guppy
behaves correctly.guppy
and cargo-guppy
can be used to solve many practical problems related to dependency graphs in large Rust
codebases. Some examples -- all of these are available through the guppy
library, and will eventually be supported in
the cargo-guppy
CLI as well:
dot
graph for a subset of crates, for formatting with graphviz
Still to come:
The core guppy
code in this repository is considered mostly complete and the API is mostly stable.
We're building a number of tools on top of guppy, and those are still are under active development. Tool requirements may cause further changes in the API, but the goal will be to avoid extensive overhauls.
guppy
's simulation of Cargo builds is extensively tested against upstream Cargo, and there are no known differences.
Comparison testing has found a number of bugs in upstream Cargo, for example:
cargo-guppy
is extensively used by the Diem Core project.
guppy
is used for several lint checks. This includes basic rules that look at every workspace package separately:
author
and license
specified-
instead of _
to more complex rules about the overall dependency graph, such as:
workspace-hack
crate (similar to rustc-workspace-hack)#[cfg(test)]
annotation)#[cfg(test)]
does not allow this)In addition, guppy-summaries
is used to generate build summaries of packages and features (particularly for high-security subsets of the codebase), and changes to these sets are flagged by Diem's CI (example).
guppy
is written on top of the excellent petgraph library. It is a separate
codebase from cargo
, depending only on the stable cargo metadata
format. (Some other tools in this space like
cargo-tree
use cargo internals directly.)
The minimum supported Rust version (MSRV) is 1.56.
While a crate is pre-release status (0.x.x) it may have its MSRV bumped in a patch release. Once a crate has reached 1.x, any MSRV bump will be accompanied with a new minor version.
See the CONTRIBUTING file for how to help out.
This project is available under the terms of either the Apache 2.0 license or the MIT license.