32 个版本 (16 个重大更新)

0.17.3 2024年7月29日
0.17.2 2024年2月5日
0.17.1 2023年10月4日
0.16.0 2023年7月29日
0.3.0 2021年3月11日

#283 in 开发工具

Download history 52433/week @ 2024-05-04 50111/week @ 2024-05-11 46887/week @ 2024-05-18 38956/week @ 2024-05-25 37280/week @ 2024-06-01 40879/week @ 2024-06-08 40937/week @ 2024-06-15 42078/week @ 2024-06-22 33259/week @ 2024-06-29 38344/week @ 2024-07-06 40427/week @ 2024-07-13 36809/week @ 2024-07-20 31943/week @ 2024-07-27 26549/week @ 2024-08-03 28117/week @ 2024-08-10 22563/week @ 2024-08-17

每月115,872次下载
7 个crate中使用(6 个直接使用)

MIT/Apache

790KB
14K SLoC

hakari

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

hakaricargo hakari 的库,这是一个用于管理 workspace-hack 包的工具。

示例

use guppy::MetadataCommand;
use hakari::{HakariBuilder, HakariOutputOptions};

// Use this workspace's PackageGraph for these tests.
let package_graph = MetadataCommand::new()
    .build_graph()
    .expect("obtained cargo-guppy's PackageGraph");

// The second argument to HakariBuilder::new specifies a Hakari (workspace-hack) package.
// In this repository, the package is called "guppy-workspace-hack".
let hakari_package = package_graph.workspace().member_by_name("guppy-workspace-hack").unwrap().id();
let hakari_builder = HakariBuilder::new(&package_graph, Some(hakari_package))
    .expect("HakariBuilder was constructed");

// HakariBuilder has a number of config options. For this example, use the defaults.
let hakari = hakari_builder.compute();

// hakari can be used to build a TOML representation that forms part of a Cargo.toml file.
// Existing Cargo.toml files can be managed using Hakari::read_toml.
let toml = hakari.to_toml_string(&HakariOutputOptions::default()).expect("TOML output was constructed");

// toml contains the Cargo.toml [dependencies] that would go in the Hakari package. It can be
// written out through `HakariCargoToml` (returned by Hakari::read_toml) or manually.
println!("Cargo.toml contents:\n{}", toml);

cargo-guppy 仓库使用由 cargo hakari 管理的 workspace-hack crate。 查看生成的 Cargo.toml

cargo-guppy 仓库还有一些用于演示 Hakari 输出的示例。 这里有一个示例。

如何使用 hakari

Hakari 遵循三个步骤的过程。

1. 配置

HakariBuilder 提供选项来配置如何执行 Hakari 计算。支持的选项包括

使用可选的 cli-support 功能,HakariBuilder 选项可以从文件中读取或写入为 TOML 或其他格式。

2. 计算

一旦配置了 HakariBuilder,可以调用其 compute 方法来创建一个 Hakari 实例。算法分为三个步骤

  1. 使用guppy为每个工作空间包和每个指定平台模拟Cargo构建,包括无功能、默认功能和所有功能。将结果收集到一个以每个依赖项及其构建时所用的不同功能集为索引的映射中。
  2. 遍历映射,找出哪些依赖项是用两个或更多不同的功能集构建的,并将它们收集到一个输出映射中。
  3. 如果假设输出映射将通过以下第3步写入到workspace-hack包中,那么它可能会导致一些额外的包用第二个功能集构建。查找这样的包,将它们添加到输出映射中,并迭代直到达到固定点且没有更多包以多种方式构建。

此计算以并行方式执行,使用Rayon库。

此计算的输出是一个Hakari实例。

3. 序列化

最后一步是将输出映射的内容序列化到workspace-hack包的Cargo.toml文件中。

  1. Hakari::read_toml从磁盘上读取现有的Cargo.toml文件。此文件是部分生成的

    [package]
    name = "workspace-hack"
    version = "0.1.0"
    # more options...
    
    ### BEGIN HAKARI SECTION
    ...
    ### END HAKARI SECTION
    

    BEGIN HAKARI SECTIONEND HAKARI SECTION行之外的内容可以手动编辑。该部分的内容是自动生成的。

    成功时,返回一个HakariCargoToml

  2. Hakari::to_toml_string返回自动生成部分的最新内容。

  3. HakariCargoToml::write_to_file将内容写入磁盘。

HakariCargoToml还支持将内容序列化到内存中并生成差异。

未来工作

hakari还缺少一些功能

  • 模拟交叉编译
  • 平台特定的排除
  • 只将最终结果中的一部分包包括在内(例如,统一核心包如syn,但不包括其他任何包)

这些功能将在有时间时添加。

贡献

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

许可

本项目可在Apache 2.0许可MIT许可下使用。

依赖项

~9–20MB
~284K SLoC