Crates.io | hakari |
lib.rs | hakari |
version | 0.17.5 |
source | src |
created_at | 2021-02-04 02:35:07.573095 |
updated_at | 2024-10-06 19:45:26.191246 |
description | Manage workspace-hack packages that do feature unification inside workspaces. |
homepage | |
repository | https://github.com/guppy-rs/guppy |
max_upload_size | |
id | 350344 |
size | 217,366 |
hakari
is the library underlying cargo hakari
, a tool to
manage workspace-hack
packages.
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);
The cargo-guppy
repository uses a workspace-hack crate managed by cargo hakari
. See the
generated Cargo.toml
.
The cargo-guppy
repository also has a number of fixtures that demonstrate Hakari's output.
Here is an example.
hakari
worksHakari follows a three-step process.
A HakariBuilder
provides options to configure how a Hakari computation is done. Options supported
include:
workspace-hack
packageWith the optional cli-support
feature, HakariBuilder
options can be
read from or written to
a file as TOML or some other format.
Once a HakariBuilder
is configured, its compute
method can be
called to create a Hakari
instance. The algorithm runs in three steps:
workspace-hack
package
through step 3 below, it is possible that it causes some extra packages to be built with a
second feature set. Look for such packages, add them to the output map, and iterate until a
fixpoint is reached and no new packages are built more than one way.This computation is done in a parallel fashion, using the Rayon library.
The result of this computation is a Hakari
instance.
The last step is to serialize the contents of the output map into the workspace-hack
package's
Cargo.toml
file.
Hakari::read_toml
reads an existing Cargo.toml
file on disk. This file is
partially generated:
[package]
name = "workspace-hack"
version = "0.1.0"
# more options...
### BEGIN HAKARI SECTION
...
### END HAKARI SECTION
The contents outside the BEGIN HAKARI SECTION
and END HAKARI SECTION
lines may be
edited by hand. The contents within this section are automatically generated.
On success, a HakariCargoToml
is returned.
Hakari::to_toml_string
returns the new contents of the
automatically generated section.
HakariCargoToml::write_to_file
writes out the contents
to disk.
HakariCargoToml
also supports serializing contents to memory and producing diffs.
hakari
is still missing a few features:
syn
but not any others)These features will be added as time permits.
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.