Inspired by Lerna
A tool that optimizes the workflow around cargo workspaces with git
and cargo
by providing utilities to
version, publish, execute commands and more.
I made this to work on clap and other projects that rely on workspaces. But this will also work on single crates because by default every individual crate is a workspace.
cargo install cargo-workspaces
The installed tool can be called by cargo workspaces
or cargo ws
. Both of them point to the same.
You can use cargo ws help
or cargo ws help <subcmd>
anytime to understand allowed options.
The basic commands available for this tool are given below. Assuming you run them inside a cargo workspace.
Initializes a new cargo workspace in the given directory. Creates Cargo.toml
if it does not exist and
fills the members
with the all the crates that can be found in that directory.
``` USAGE: cargo workspaces init [path]
ARGS:
FLAGS: -h, --help Prints help information ```
Interactively creates a new crate in the workspace. We recommend using this instead of cargo new
. All
the crates start with 0.0.0
version because the version is responsible for determining the
version.
```
USAGE:
cargo workspaces create
ARGS:
FLAGS: -h, --help Prints help information ```
Lists crates in the workspace.
``` USAGE: cargo workspaces list [FLAGS]
FLAGS: -a, --all Show private crates that are normally hidden -h, --help Prints help information --json Show information as a JSON array -l, --long Show extended information ```
Several aliases are available.
cargo ws ls
implies cargo ws list
cargo ws ll
implies cargo ws list --long
cargo ws la
implies cargo ws list --all
List crates that have changed since the last git tag. This is useful to see the list of crates that would be the subjects of the next version or publish command.
``` USAGE: cargo workspaces changed [FLAGS] [OPTIONS]
FLAGS: -a, --all Show private crates that are normally hidden -h, --help Prints help information --include-merged-tags Include tags from merged branches --json Show information as a JSON array -l, --long Show extended information
OPTIONS:
--force
Executes an arbitrary command in each crate of the workspace.
```
USAGE:
cargo workspaces exec [FLAGS]
ARGS:
FLAGS: -h, --help Prints help information --no-bail Continue executing command despite non-zero exit in a given crate ```
For example, if you want to run ls -l
in each crate, you can simply do cargo ws exec ls -l
.
Bump versions of the crates in the worksapce. This command does the following:
You can influence the above steps with the flags and options for this command.
``` USAGE: cargo workspaces version [FLAGS] [OPTIONS] [ARGS]
ARGS:
FLAGS:
-a, --all Also do versioning for private crates (will not be published)
--amend Amend the existing commit, instead of generating a new one
--exact Specify inter dependency version numbers exactly with =
-h, --help Prints help information
--include-merged-tags Include tags from merged branches
--no-git-commit Do not commit version changes
--no-git-push Do not push generated commit and tags to git remote
--no-git-tag Do not tag generated commit
--no-global-tag Do not create a global tag for a workspace
--no-individual-tags Do not tag individual versions for crates
-y, --yes Skip confirmation prompt
OPTIONS:
--allow-branch %n
) [default: %n@]
-m, --message
By default, all the crates in the workspace will share a single version. But if you want the crate to have it's version be independent of the other crates, you can add the following to that crate:
toml
[package.metadata.workspaces]
independent = true
Publish all the crates from the workspace in the correct order according to the dependencies. By default,
this command runs version first. If you do not want that to happen, you can supply the
--from-git
option.
``` USAGE: cargo workspaces publish [FLAGS] [OPTIONS] [ARGS]
ARGS:
FLAGS:
-a, --all Also do versioning for private crates (will not be published)
--amend Amend the existing commit, instead of generating a new one
--exact Specify inter dependency version numbers exactly with =
--from-git Publish crates from the current commit without versioning
-h, --help Prints help information
--include-merged-tags Include tags from merged branches
--no-git-commit Do not commit version changes
--no-git-push Do not push generated commit and tags to git remote
--no-git-tag Do not tag generated commit
--no-global-tag Do not create a global tag for a workspace
--no-individual-tags Do not tag individual versions for crates
--no-verify Skip crate verification (not recommended)
--skip-published Skip already published crate versions
-y, --yes Skip confirmation prompt
OPTIONS:
--allow-branch %n
) [default: %n@]
-m, --message
Here is a list of Contributors
Please see CHANGELOG.md.
MIT/X11
Report here.
Pavan Kumar Sunkara (pavan.sss1991@gmail.com)