pub struct PackageGraph { /* private fields */ }
Expand description
A graph of packages and dependencies between them, parsed from metadata returned by cargo metadata
.
For examples on how to use PackageGraph
, see
the examples
directory
in this crate.
Implementations§
source§impl PackageGraph
impl PackageGraph
sourcepub fn feature_graph(&self) -> FeatureGraph<'_>
pub fn feature_graph(&self) -> FeatureGraph<'_>
Returns a derived graph representing every feature of every package.
The feature graph is constructed the first time this method is called. The graph is cached so that repeated calls to this method are cheap.
source§impl PackageGraph
impl PackageGraph
sourcepub fn from_command(command: &mut MetadataCommand) -> Result<Self, Error>
pub fn from_command(command: &mut MetadataCommand) -> Result<Self, Error>
Executes the given MetadataCommand
and constructs a PackageGraph
from it.
sourcepub fn from_metadata(metadata: CargoMetadata) -> Result<Self, Error>
pub fn from_metadata(metadata: CargoMetadata) -> Result<Self, Error>
Parses the given Metadata
and constructs a PackageGraph
from it.
sourcepub fn from_json(json: impl AsRef<str>) -> Result<Self, Error>
pub fn from_json(json: impl AsRef<str>) -> Result<Self, Error>
Constructs a package graph from the given JSON output of cargo metadata
.
Generally, guppy
expects the cargo metadata
command to be run with --all-features
, so
that guppy
has a full view of the dependency graph.
For full functionality, cargo metadata
should be run without --no-deps
, so that guppy
knows about third-party crates and dependency edges. However, guppy
supports a “light”
mode if --no-deps
is run, in which case the following limitations will apply:
- dependency queries will not work
- there will be no information about non-workspace crates
sourcepub fn package_ids(&self) -> impl ExactSizeIterator<Item = &PackageId>
pub fn package_ids(&self) -> impl ExactSizeIterator<Item = &PackageId>
Returns an iterator over all the package IDs in this graph.
sourcepub fn packages(&self) -> impl ExactSizeIterator<Item = PackageMetadata<'_>>
pub fn packages(&self) -> impl ExactSizeIterator<Item = PackageMetadata<'_>>
Returns an iterator over all the packages in this graph.
sourcepub fn metadata(
&self,
package_id: &PackageId,
) -> Result<PackageMetadata<'_>, Error>
pub fn metadata( &self, package_id: &PackageId, ) -> Result<PackageMetadata<'_>, Error>
Returns the metadata for the given package ID.
sourcepub fn package_count(&self) -> usize
pub fn package_count(&self) -> usize
Returns the number of packages in this graph.
sourcepub fn link_count(&self) -> usize
pub fn link_count(&self) -> usize
Returns the number of links in this graph.
sourcepub fn new_depends_cache(&self) -> DependsCache<'_>
pub fn new_depends_cache(&self) -> DependsCache<'_>
Creates a new cache for depends_on
queries.
The cache is optional but can speed up some queries.
sourcepub fn depends_on(
&self,
package_a: &PackageId,
package_b: &PackageId,
) -> Result<bool, Error>
pub fn depends_on( &self, package_a: &PackageId, package_b: &PackageId, ) -> Result<bool, Error>
Returns true if package_a
depends (directly or indirectly) on package_b
.
In other words, this returns true if package_b
is a (possibly transitive) dependency of
package_a
.
This also returns true if package_a
is the same as package_b
.
For repeated queries, consider using new_depends_cache
to speed up queries.
sourcepub fn directly_depends_on(
&self,
package_a: &PackageId,
package_b: &PackageId,
) -> Result<bool, Error>
pub fn directly_depends_on( &self, package_a: &PackageId, package_b: &PackageId, ) -> Result<bool, Error>
Returns true if package_a
directly depends on package_b
.
In other words, this returns true if package_b
is a direct dependency of package_a
.
This returns false if package_a
is the same as package_b
.
source§impl PackageGraph
impl PackageGraph
§Queries
The methods in this section create queries over subsets of this package graph. Use the methods here to analyze transitive dependencies.
sourcepub fn query_workspace(&self) -> PackageQuery<'_>
pub fn query_workspace(&self) -> PackageQuery<'_>
Creates a new forward query over the entire workspace.
query_workspace
will select all workspace packages and their transitive dependencies. To
create a PackageSet
with just workspace packages, use resolve_workspace
.
sourcepub fn query_workspace_paths(
&self,
paths: impl IntoIterator<Item = impl AsRef<Utf8Path>>,
) -> Result<PackageQuery<'_>, Error>
pub fn query_workspace_paths( &self, paths: impl IntoIterator<Item = impl AsRef<Utf8Path>>, ) -> Result<PackageQuery<'_>, Error>
Creates a new forward query over the specified workspace packages by path.
Returns an error if any workspace paths were unknown.
sourcepub fn query_workspace_names(
&self,
names: impl IntoIterator<Item = impl AsRef<str>>,
) -> Result<PackageQuery<'_>, Error>
pub fn query_workspace_names( &self, names: impl IntoIterator<Item = impl AsRef<str>>, ) -> Result<PackageQuery<'_>, Error>
Creates a new forward query over the specified workspace packages by name.
This is similar to cargo
’s --package
option.
Returns an error if any package names were unknown.
sourcepub fn query_directed<'g, 'a>(
&'g self,
package_ids: impl IntoIterator<Item = &'a PackageId>,
dep_direction: DependencyDirection,
) -> Result<PackageQuery<'g>, Error>
pub fn query_directed<'g, 'a>( &'g self, package_ids: impl IntoIterator<Item = &'a PackageId>, dep_direction: DependencyDirection, ) -> Result<PackageQuery<'g>, Error>
Creates a new query that returns transitive dependencies of the given packages in the specified direction.
Returns an error if any package IDs are unknown.
sourcepub fn query_forward<'g, 'a>(
&'g self,
package_ids: impl IntoIterator<Item = &'a PackageId>,
) -> Result<PackageQuery<'g>, Error>
pub fn query_forward<'g, 'a>( &'g self, package_ids: impl IntoIterator<Item = &'a PackageId>, ) -> Result<PackageQuery<'g>, Error>
Creates a new query that returns transitive dependencies of the given packages.
Returns an error if any package IDs are unknown.
sourcepub fn query_reverse<'g, 'a>(
&'g self,
package_ids: impl IntoIterator<Item = &'a PackageId>,
) -> Result<PackageQuery<'g>, Error>
pub fn query_reverse<'g, 'a>( &'g self, package_ids: impl IntoIterator<Item = &'a PackageId>, ) -> Result<PackageQuery<'g>, Error>
Creates a new query that returns transitive reverse dependencies of the given packages.
Returns an error if any package IDs are unknown.
source§impl PackageGraph
impl PackageGraph
sourcepub fn resolve_all(&self) -> PackageSet<'_>
pub fn resolve_all(&self) -> PackageSet<'_>
Creates a new PackageSet
consisting of all members of this package graph.
This is normally the same as query_workspace().resolve()
, but can differ if packages have
been replaced with [patch]
or [replace]
.
In most situations, query_workspace
is preferred. Use resolve_all
if you know you need
parts of the graph that aren’t accessible from the workspace.
sourcepub fn resolve_none(&self) -> PackageSet<'_>
pub fn resolve_none(&self) -> PackageSet<'_>
Creates a new, empty PackageSet
associated with this package graph.
sourcepub fn resolve_ids<'a>(
&self,
package_ids: impl IntoIterator<Item = &'a PackageId>,
) -> Result<PackageSet<'_>, Error>
pub fn resolve_ids<'a>( &self, package_ids: impl IntoIterator<Item = &'a PackageId>, ) -> Result<PackageSet<'_>, Error>
Creates a new PackageSet
consisting of the specified package IDs.
This does not include transitive dependencies. To do so, use the query_
methods.
Returns an error if any package IDs are unknown.
sourcepub fn resolve_workspace(&self) -> PackageSet<'_>
pub fn resolve_workspace(&self) -> PackageSet<'_>
Creates a new PackageSet
consisting of all packages in this workspace.
This does not include transitive dependencies. To do so, use query_workspace
.
sourcepub fn resolve_workspace_paths(
&self,
paths: impl IntoIterator<Item = impl AsRef<Utf8Path>>,
) -> Result<PackageSet<'_>, Error>
pub fn resolve_workspace_paths( &self, paths: impl IntoIterator<Item = impl AsRef<Utf8Path>>, ) -> Result<PackageSet<'_>, Error>
Creates a new PackageSet
consisting of the specified workspace packages by path.
This does not include transitive dependencies. To do so, use query_workspace_paths
.
Returns an error if any workspace paths are unknown.
sourcepub fn resolve_workspace_names(
&self,
names: impl IntoIterator<Item = impl AsRef<str>>,
) -> Result<PackageSet<'_>, Error>
pub fn resolve_workspace_names( &self, names: impl IntoIterator<Item = impl AsRef<str>>, ) -> Result<PackageSet<'_>, Error>
Creates a new PackageSet
consisting of the specified workspace packages by name.
This does not include transitive dependencies. To do so, use query_workspace_names
.
Returns an error if any workspace names are unknown.
sourcepub fn resolve_package_name(&self, name: impl AsRef<str>) -> PackageSet<'_>
pub fn resolve_package_name(&self, name: impl AsRef<str>) -> PackageSet<'_>
Creates a new PackageSet
consisting of packages with the given name.
The result is empty if there are no packages with the given name.
Trait Implementations§
source§impl Clone for PackageGraph
impl Clone for PackageGraph
source§fn clone(&self) -> PackageGraph
fn clone(&self) -> PackageGraph
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for PackageGraph
impl Debug for PackageGraph
source§impl<'a> TryFrom<&'a MetadataCommand> for PackageGraph
impl<'a> TryFrom<&'a MetadataCommand> for PackageGraph
source§impl TryFrom<CargoMetadata> for PackageGraph
impl TryFrom<CargoMetadata> for PackageGraph
source§impl TryFrom<MetadataCommand> for PackageGraph
impl TryFrom<MetadataCommand> for PackageGraph
Although consuming a MetadataCommand
is not required for building a PackageGraph
, this impl
is provided for convenience.
Auto Trait Implementations§
impl !Freeze for PackageGraph
impl RefUnwindSafe for PackageGraph
impl Send for PackageGraph
impl Sync for PackageGraph
impl Unpin for PackageGraph
impl UnwindSafe for PackageGraph
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more