Note: clap v3 has been in development for several years and has changed
hands multiple times. Unfortunately, our changelog might be incomplete,
whether in changes or their motivation.
Highlights
A special thanks to the maintainers, contributors, beta users, and sponsors who
have helped along this journey, especially kbknapp.
StructOpt Integration
StructOpt provides a serde-like declarative
approach to defining your parser. The main benefits we've seen so far from integrating are:
- Tighter feedback between the design of clap and the derives
- More universal traits. Crates exist for common CLI patterns
(example)
and we've re-designed theStructOpt
traits so crates built on clap3 can be
reused not just with other derives but also people using the builder API.
People can even hand implement these so people using the builder API won't
have the pay the cost for derives.
Custom Help Headings
Previously, clap automatically grouped arguments in the help as either
ARGS
, FLAGS
, OPTIONS
, and SUBCOMMANDS
.
You can now override the default group with Arg::help_heading
and
App::subcommand_help_heading
. To apply a heading to a series of arguments,
you can set App::help_heading
.
Deprecations
While a lot of deprecations have been added to clean up the API (overloaded
meaning of Arg::multiple
) or make things more consistent, some particular
highlights are:
clap_app!
has been deprecated in favor of the builder API witharg!
(clap-rs/clap#2835)Arg::from_usage
has been deprecated in favor ofarg!
(clap-rs/clap#3087)- The YAML API has been deprecated in favor the builder or derive APIs (clap-rs/clap#3087)
Migrating
From clap v2
- Add CLI tests,
-h
and--help
output at a minimum (recommendation: trycmd for snapshot testing) - Update your dependency
- If you use
no-default-features
: add thestd
feature
- If you use
- Resolve compiler errors
- Resolve behavior changes
- Refactor your
App
creation to a function and add a test similar to the one below, resolving any of its assertions - Look over the "subtle changes" under BREAKING CHANGES
- If using builder: test your application under various circumstances to see if
ArgMatches
asserts regardingAllowInvalidUtf8
.
- Refactor your
- At your leisure: resolve deprecation notices
Example test:
fn app() -> clap::App<'static> {
...
}
#[test]
fn verify_app() {
app().debug_assert();
}
From structopt 0.3.25
- Add CLI tests,
-h
and--help
output at a minimum (recommendation: trycmd for snapshot testing) - Update your dependency, adding the
derive
feature flag- If you use
no-default-features
: add thestd
feature
- If you use
- Resolve compiler errors, including
- Update your
use
statements fromstructopt
andstructopt::clap
toclap
- Update your
- Resolve behavior changes
- Add a test similar to the one below, resolving any of its assertions
- Look over the "subtle changes" under BREAKING CHANGES
- At your leisure: resolve deprecation notices
Example test:
#[derive(clap::StructOpt)]
struct Args {
...
}
#[test]
fn verify_app() {
use clap::IntoApp;
Args::into_app().debug_assert()
}
From clap v3.0.0-beta.5
- Add CLI tests,
-h
and--help
output at a minimum (recommendation: trycmd for snapshot testing) - Update your dependency
- Add in
derive
,env
,cargo
, orunicode
feature flags as needed
- Add in
- Resolve compiler errors
- If you use
yaml
,clap_app!
, or usage parser: revert any changes you made for clap3 - Change
Arg::about
Arg::long_about
back tohelp
andlong_help
and changePossibleValue::about
tohelp
(clap-rs/clap#3075) - Change
AppSettings::HelpRequired
toAppSettings::HelpExpected
- Change
PossibleValue::hidden
toPossibleValue::hide
- Change
App::subcommand_placeholder
toApp::subcommand_value_name
/App::subcommand_help_heading
- If you use
- Resolve behavior changes
- Add the above listed test appropriate for your application and resolve any problems it reports
- If using
derive
: see the structopt breaking changes section forVec
changes - If using builder: test your application under various circumstances to see if
ArgMatches
asserts regardingAllowInvalidUtf8
.
- At your leisure: resolve deprecation notices
BREAKING CHANGES
From clap 2
Subtle changes (i.e. compiler won't catch):
AppSettings::UnifiedHelpMessage
is now default behaviour{flags}
and{unified}
will assert if present inApp::help_template
- See clap-rs/clap#2807
AppSettings::EnableColoredHelp
is now the default behavior but can be
opted-out withAppSettings::DisableColoredHelp
(clap-rs/clap#2806)App::override_usage
no longer implies a leading\t
, allowing multi lined usagesArg::require_equals
no longer impliesArgSettings::ForbidEmptyValues
(#2233)Arg::require_delimiter
no longer impliesArgSettings::TakesValue
andArgSettings::UseValueDelimiter
(#2233)Arg::env
,Arg::env_os
,Arg::last
,Arg::require_equals
,Arg::allow_hyphen_values
,
Arg::hide_possible_values
,Arg::hide_default_value
,Arg::hide_env_values
,
Arg::case_insensitive
andArg::multiple_values
no longer implyArgSettings::TakesValue
(#2233)ArgMatches::is_present
no longer checks subcommand names- Some env variable values are now considered false for flags, not just "not-present" (clap-rs/clap#2539)
- Changed
...
s meaning in usage parser. Before, it always meantmultiple
which is still true for--option [val]...
. Now[name]... --option [val]
results inArgSettings::MultipleOccurrences
.
Easier to catch changes:
- When using
no-default-features
, you now have to specify thestd
feature (reserved for future work) - Gated env support behind
env
feature flag- Impacts
Arg::env
,Arg::env_os
,Arg::hide_env_values
,ArgSettings::HideEnvValues
- See clap-rs/clap#2694
- Impacts
- Gated crate information behind
cargo
feature flag- Impacts
crate_name!
,crate_version!
,crate_authors!
,crate_description!
,app_from_crate!
- Impacts
AppSettings::StrictUtf8
is now default behaviour and asserts if
AppSettings::AllowInvalidUtf8ForExternalSubcommands
and
ArgSettings::AllowInvalidUtf8
andArgMatches::value_of_os
aren't used
togetherAppSettings::AllowInvalidUtf8
has been removed- clap-rs/clap#751
Arg::short
andArg::value_delimiter
now take achar
instead of a&str
ArgMatches
panics on unknown arguments- Removed
VersionlessSubcommands
, making it the default (see clap-rs/clap#2812) - Completion generation has been split out into clap_complete.
- Removed
ArgSettings::EmptyValues
in favor ofArgSettings::ForbidEmptyValues
- Validator signatures have been loosed:
Arg::validator
now takes first argument asFn(&str) -> Result<O, E: ToString>
instead of
Fn(String) -> Result<(), String>
Arg::validator_os
now takes first argument asFn(&OsStr) -> Result<O, OsString>
instead of
Fn(&OsStr) -> Result<(), OsString>
Arg::value_name
now sets, rather than appends (see clap-rs/clap#2634)- Upgrade
yaml-rust
from 0.3 to 0.4 - Replaced
ArgGroup::from(BTreeMap)
toArgGroup::from(yaml)
- Replaced
ArgMatches::usage
withApp::generate_usage
- Replaced
Arg::settings
withArg::setting(Setting1 | Setting2)
App
andArg
now need only one lifetime- Removed deprecated
App::with_defaults
, replaced withapp_from_crate
- Removed deprecated
AppSettings::PropagateGlobalValuesDown
(now the default) - Some
App
functions, likeApp::write_help
now take&mut self
instead of&self
Error::message
is now private, useError::to_string
Arg::default_value_if
,Arg::default_value_if_os
,Arg::default_value_ifs
,
Arg::default_value_ifs_os
now takes the default value parameter as an option (clap-rs/clap#1406)- Changed
App::print_help
&App::print_long_help
to now returnstd::io::Result
- Changed
App::write_help
&App::write_long_help
to now returnstd::io::Result
- Changed
Arg::index
,Arg::number_of_values
,Arg::min_values
,Arg::max_values
to takingusize
instead of u64 - Changed
Error::info
to typeVec<String>
instead ofOption<Vec<String>>
- Changed
ArgMatches::subcommand
to now returnOption<(&str, &ArgMatches)>
- Renamed
ErrorKind::MissingArgumentOrSubcommand
toErrorKind::DisplayHelpOnMissingArgumentOrSubcommand
- Renamed
ErrorKind::HelpDisplayed
toErrorKind::DisplayHelp
- Renamed
ErrorKind::VersionDisplayed
toErrorKind::DisplayVersion
- Added
#[non_exhaustive]
toclap::{ValueHint, ErrorKind, AppSettings, ArgSettings}
(clap-rs/clap#3167)
From structopt 0.3.25
- By default, the
App
isn't initialized with crate information anymore. Now opt-in via#[clap(author)]
,#[clap(about)]
,#[clap(version)]
(clap-rs/clap#3034) #[clap(default_value)]
is replaced with#[clap(default_value_t)]
(clap-rs/clap#1694)- Subcommands nested under subcommands now needs a
#[clap(subcommand)]
attribute (clap-rs/clap#2587) Vec<_>
andOption<Vec<_>>
have changed frommultiple
tomultiple_occurrences
On top of the clap 2 changes
Performance
From clap 2
- Split out non-default
unicode
feature flag for faster builds and smaller binaries for ASCII-only CLIs. - Split out non-default
env
feature flag for faster builds and smaller binaries.
Features
From clap 2
-
Integration of
structopt::StructOpt
viaclap::Parser
(requiresderive
feature flag) -
Custom help headings
App::help_heading
(apply to all future args)Arg::help_heading
(apply to current arg)App::subcommand_help_heading
along withApp::subcommand_value_name
(apply to subcommands)- See clap-rs/clap#805
AppSettings::UnifiedHelpMessage
is now default behaviour (clap-rs/clap#2807)
-
Deriving of
ArgEnum
for generatingArg::possible_values
(requiresderive
feature flag) -
Disable built-in help/version behavior with
AppSettings::NoAutoHelp
andAppSettings::NoAutoVersion
-
Change an existing arg with new builder method
mut_arg
(particularly helpful for--help
and--version
) -
Provide extra context in long help messages (
--help
) withbefore_long_help
andafter_long_help
(clap-rs/clap#1903) -
Detect missing help descriptions via debug asserts by enabling
AppSettings::HelpExpected
-
Aliases for short flags (clap-rs/clap#1896)
-
Validate UTF-8 values, rather than panicing during
ArgMatches::value_of
thanks toAppSettings::AllowInvalidUtf8ForExternalSubcommands
andArgSettings::AllowInvalidUtf8
- Debug builds will assert when the
ArgMatches
calls do not match the UTF-8 setting. - See clap-rs/clap#751
- Debug builds will assert when the
-
clap::PossibleValue
to allow- Hiding (clap-rs/clap#2756)
- Completion help for possible values for args (clap-rs/clap#2731)
-
Allow arguments to conflict with all others via
Arg::exclusive
(clap-rs/clap#1583) -
Validate arguments with a regex (required
regex
feature flag)- See clap-rs/clap
-
Arg::default_missing_value
for cases like--color[=<WHEN>]
(clap-rs/clap#1587) -
clap::App::color
/clap::ColorChoice
to specify color setting for the app -
Custom error reporting with
App::error
-
App::debug_assert
test helper -
Replace
Arg::multiple(bool)
withArg::multiple_values
/Arg::multiple_occurrences
- Positionals can be either
-
Added support for flag subcommands like pacman (clap-rs/clap#1361)
-
Partial parsing via
AppSettings::IgnoreErrors
(clap-rs/clap#1880) -
Enable
cmd help
to print long help (--help
instead of-h
) withAppSettings::UseLongFormatForHelpSubcommand
(clap-rs/clap#2435) -
Allow long arg abbreviations like we do with subcommands via
AppSettings::InferLongArgs
(clap-rs/clap#2435) -
Detect subcommands among positional arguments with
AppSettings::SubcommandPrecedenceOverArg
-
Give completion scripts hints with
Arg::value_hint
(clap-rs/clap#1793) -
Allow unsetting defaults with
-
Arg::default_value_if
,Arg::default_value_if_os
,Arg::default_value_ifs
,
Arg::default_value_ifs_os
(clap-rs/clap#1406) -
Interpret some env variable values as
false
for flags, in addition to "not-present" (clap-rs/clap#2539)n
,no
,f
,false
,off
,0
-
Added
arg!
macro for creating anArg
from a compile-time usage parser -
(Experimental) Busybox-like multi-call support
- See
AppSettings::Multicall
behindunstable-multicall
feature flag - See clap-rs/clap#1120
- See
-
(Experimental) Alias an argument to anything group of arguments
- See
App::replace
behindunstable-replace
feature flag - See clap-rs#1603
- See
-
(Experimental) Grouping of multiple values within multiple occurrences
- See
ArgMatches::grouped_values_of
behindunstable-grouped
feature flag - See clap-rs/clap#1026
- See
From structopt 0.3.25
- Allow defaulting with native types via new
default_value_t [= <expr>]
attribute (clap-rs/clap#1694) - New
update
API - New
arg_enum
attribute for integrating withArgEnum
trait
On top of the clap 2 changes
Fixes
From clap 2
- Correctly handle colored output on Windows
- Only generate version flags when
App::version
,App::long_version
are set
(see clap-rs/clap#2812) - General completion script improvements
- Limited default help text wrapping to 100 when
wrap_help
feature is not enabled - Be more specific than
Arg::multiple
withArg::multiple_values
andArg::multiple_occurrences
app_from_crate!
defaults to separating multiple authors with", "
- Ensure all examples work
IgnoreCase
is now unicode aware (requiresunicode
feature flag)- Always respect
ColorChoice::Never
, even if that means we skip colors in some cases ArgMatches
panics on unknown arguments- Gracefully handle empty
authors
field inCargo.toml
withapp_from_crate
- Do not show
--help
incmd help
withDisableHelpFlag
(clap-rs/clap#3169) - Do not show
--help
incmd help help
that doesn't work (clap-rs/clap#3169)
From structopt 0.3.25
- Support
SubcommandsNegateReqs
by allowing requiredOption<_>
s (clap-rs/clap#2255) - Infer
AllowInvalidUtf8
based on parser (clap-rs/clap#751) - Gracefully handle empty
authors
field inCargo.toml
- Don't panic with
default_value_os
but treat it likedefault_value
(clap-rs/clap#3031) - When using
flatten
andsubcommand
, ensure our doc comment always overrides the nested container's doc comment, whether it has onlyabout
orabout
andlong_about
(#3175)
On top of the clap 2 changes
Minimum Required Rust
- As of this release,
clap
requiresrustc 1.54.0
or greater.