54个版本

0.17.7 2024年8月1日
0.17.6 2024年7月29日
0.17.5 2024年2月4日
0.17.4 2023年11月29日
0.1.2 2019年11月26日

数据结构 类别中排名第 35

Download history 64010/week @ 2024-05-04 65159/week @ 2024-05-11 59726/week @ 2024-05-18 50036/week @ 2024-05-25 52823/week @ 2024-06-01 56303/week @ 2024-06-08 57459/week @ 2024-06-15 60916/week @ 2024-06-22 45104/week @ 2024-06-29 54008/week @ 2024-07-06 55859/week @ 2024-07-13 53550/week @ 2024-07-20 47804/week @ 2024-07-27 41988/week @ 2024-08-03 45768/week @ 2024-08-10 38083/week @ 2024-08-17

每月下载量183,292
用于 51 个crate(其中30个直接使用)

MIT/Apache

600KB
11K SLoC

guppy

guppy on crates.io Documentation (latest release) Documentation (main) License License

跟踪和查询Cargo依赖图。

guppy 提供了一个Rust接口来运行对Cargo依赖图的查询。 guppy 解析 cargo metadata 的输出,然后在其上提供一个图形界面。

类型和生命周期

guppy 公开的中心结构是 PackageGraph。这代表了一个有向图(尽管 不一定是无环的),其中每个节点是一个包,每条边代表一个依赖关系。

其他类型从 PackageGraph 借用数据,并有一个表示此点的 'g 生命周期参数。命名生命周期参数 'g 总是表示数据是从 PackageGraph 借用的。

PackageMetadata 包含有关各个包的信息,例如 “包”部分 中的数据。

为了遍历图,guppy 提供了一些类型

  • PackageLink 代表依赖边两端,以及有关依赖关系的详细信息(例如,它是否仅用于开发、平台特定等)。
  • PackageQuery 代表依赖遍历的输入参数:一组包和方向。遍历通过 PackageQuery::resolve 来执行,并通过 PackageQuery::resolve_with_fn 实现对遍历的细粒度控制。
  • PackageSet 代表图遍历的结果。这个结构体提供了多种方法来遍历包。

对于某些操作,当首次需要时,guppy 会构建一个辅助的 FeatureGraph。在 FeatureGraph 中的每个节点都是一个包和一个在其中声明的特征的组合,每条边都是一个特征依赖。

为了遍历特征图,guppy 提供了类似的 FeatureQueryFeatureSet 类型。

FeatureSet 还有一个 into_cargo_set 方法,用于模拟 Cargo 构建。此方法生成一个 CargoSet,它本质上是由两个 FeatureSet 和一些更有用的信息组成的。

guppy 的数据结构是不可变的,并有一些内部缓存。所有 guppy 的类型都是 Send + Sync,所有生命周期参数都是 协变的

可选特性

  • proptest1:使用 proptest 框架支持基于属性的测试。
  • rayon1:通过 Rayon 支持并行迭代器(目前是初步工作,未来将添加更多并行迭代器)。
  • summaries:支持编写 构建摘要

示例

打印出一个包的所有直接依赖

use guppy::{CargoMetadata, PackageId};

// `guppy` accepts `cargo metadata` JSON output. Use a pre-existing fixture for these examples.
let metadata = CargoMetadata::parse_json(include_str!("../../fixtures/small/metadata1.json")).unwrap();
let package_graph = metadata.build_graph().unwrap();

// `guppy` provides several ways to get hold of package IDs. Use a pre-defined one for this
// example.
let package_id = PackageId::new("testcrate 0.1.0 (path+file:///fakepath/testcrate)");

// The `metadata` method returns information about the package, or `None` if the package ID
// wasn't recognized.
let package = package_graph.metadata(&package_id).unwrap();

// `direct_links` returns all direct dependencies of a package.
for link in package.direct_links() {
    // A dependency link contains `from()`, `to()` and information about the specifics of the
    // dependency.
    println!("direct dependency: {}", link.to().id());
}

有关更多示例,请参阅 examples 目录

贡献

有关如何帮助的详细信息,请参阅 CONTRIBUTING 文件。

许可

此项目可在 Apache 2.0 许可证或 MIT 许可证的条款下使用。

依赖关系

~4.5–6.5MB
~112K SLoC