#query #cargo-workspace #command #version #complex #manage #publish

bin+lib cargo-workspace2

A tool to query and manage complex cargo workspaces

6 releases

0.2.2 Feb 18, 2021
0.2.1 Oct 23, 2020
0.1.1 Oct 18, 2020
0.0.0 Oct 17, 2020

#738 in Cargo plugins

GPL-3.0-or-later

57KB
1.5K SLoC

cargo-workspace2 🔹 pipeline status

A better tool to manage complex cargo workspaces, by dynamically building a dependency graph of your project to query, and run commands on. This project is both a CLI and a library. A repl is on the roadmap.

Usage

When using cargo-ws2 you first provide it some query to find crates in your workspace, and then a command with it's specific parameters to execute for each crate selected in the query.

cargo ws2 <QUERY LANG> <COMMAND> [COMMAND OPTIONS]

Currently supported commands.

  • print - echo the selected crate set
  • publish - publish a set of crates

Additionally, there are special "bang commands", that take precedence over other argument line input, and don't have to be put in a particular position.

  • !help [COMMAND] - show a help screen for the program, or a specific command
  • !version - print the program, rustc version, etc
  • !debug - enable debug printing, and parse the rest of the line as normal

cargo-ws2 provides a query system based on the ws2ql query expression language. Following are some examples.

  • List crates between [ ]: [ foo bar baz ]
  • Or query the dependency graph with a {} block: { foo < } (all crates that depend on foo)
  • Include crates by path tree: [ ./foo/* ] (not implemented yet!)
  • Even search via regex: [/crate-suffix\$/] (not implemented yet!)

See the full description of ws2ql in the docs!

Publishing crates

This tool was largely written to make publishing crates in a workspace easier. Let's look at an example.

[package]
name = "foo"
version = "0.1.0"
# ...

[dependencies]
bar = { version = "0.5.0", path = "../bar" }
[package]
name = "bar"
version = "0.5.0"

This is a common setup: pointing cargo at the path of bar means that changes to the sources on disk become available, before having to publish to crates.io. But having a version dependency is required when trying to publish, thus we add this too.

Unfortunately now, when we update bar to version 0.6.0 our workspace will stop building, because foo depends on a version of bar that's different from the one we're pointing it to.

What cargo-ws2 does when you run cargo ws2 [bar] publish minor is bump bar to 0.6.0, and also update the dependency line in foo to be { version = "0.6.0", path = "../bar" }, without touching the version of foo.

If you want all dependent crates to be bumped to the same version, prefix your publish level (major, minor, patch, or a semver string) with =.

cargo ws2 [bar] publish =minor will bump both foo, and bar to 0.6.0 (picking the highest version of the set if their starting versions are not yet the same.

License

cargo-workspace2 is free software, licensed under the GNU General Public License 3.0 (or later). See the LICENSE file for a full copy of the license.

Dependencies

~4.5MB
~73K SLoC