5.0.0
This release splits the package into separate modules to help produce smaller binaries. Parsing and running commands are now separated, which allows for custom run
types. This release includes the SuspendingCliktCommand
and the ChainedCliktCommand
, and it's easy to define your own.
See the migration guide for details on upgrading to Clikt 5.0.
Added
- Publish
iosArm64
andiosX64
targets. - Added
NoSuchArgument
exception that is thrown when too many arguments were given on the command line. Previously, a less specificUsageError
was thrown instead. - Added
CommandLineParser.tokenize
that splits a string into argv tokens. - Added
CommandLineParser
that provides functions for parsing and finalizing commands manually for more control. - Added
Context.invokedSubcommands
that contains all subcommands of the current command that are going to be invoked whenallowMultipleSubcommands
istrue
. - Added
SuspendingCliktCommand
that has asuspend fun run
method, allowing you to use coroutines in your commands. - Added
ChainedCliktCommand
that allows you to return a value from yourrun
method and pass it to the next command in the chain. - Added
Context.data
as an alternative toobj
that allows you to store more than one object in the context. - Added
Context.echoer
to customize howecho
messages are printed. - Added
CompletionGenerator
to manually generate completions for a command. - Added
Context.exitProcess
which you can use to prevent the process from exiting during tests. - Added core module that supports watchOS, tvOS, and wasmWasi targets and has no dependencies.
- Added more options to
CliktCommand.test
to control the terminal interactivity. (#517) - Added
associate{}
,associateBy{}
, andassociateWith{}
transforms for options that allow you to convert the keys and values of the map. (#529) - Added support for aliasing options to other options. (#535)
- Added
limit
andignoreCase
parameters tooption().split()
. (#541) - Support calling
--help
on subcommands when parents have required parameters.
Changed
-
In a subcommand with and an
argument()
withmultiple()
oroptional()
, the behavior is now the same regardless of the value ofallowMultipleSubcommands
: if a token matches a subcommand name, it's now treated as a subcommand rather than a positional argument. -
Due to changes to the internal parsing algorithm, the exact details of error messages when multiple usage errors occur have changed in some cases.
-
Breaking Change: Moved the following parameters from
CliktCommand
's constructor; override the corresponding properties instead:removed parameter replacement property help
fun help
epilog
fun helpEpilog
invokeWithoutSubcommand
val invokeWithoutSubcommand
printHelpOnEmptyArgs
val printHelpOnEmptyArgs
helpTags
val helpTags
autoCompleteEnvvar
val autoCompleteEnvvar
allowMultipleSubcommands
val allowMultipleSubcommands
treatUnknownOptionsAsArgs
val treatUnknownOptionsAsArgs
hidden
val hiddenFromHelp
-
The following methods on
CliktCommand
have been renamed:commandHelp
->help
,commandHelpEpilog
->epilog
. The old names are deprecated. -
Breaking Change:
CliktCommand.main
andCliktCommand.parse
are now extension functions rather than methods. -
Breaking Change:
Context.obj
andContext.terminal
, andOptionTransformContext.terminal
are now extension functions rather than properties. -
Breaking Change: The
RenderedSection
andDefinitionRow
classes have moved toAbstractHelpFormatter
. -
Markdown support in the help formatter is no longer included by default. To enable it, include the
:clikt-markdown
dependency and callyourCommand.installMordantMarkdown()
before parsing. -
Updated Kotlin to 2.0.0
Fixed
- Fixed excess arguments not being reported when
allowMultipleSubcommands=true
and a subcommand has excess arguments followed by another subcommand. - Commands with
printHelpOnEmptyArgs=true
will no longer print help if an option has a value from an environment variable or value source. (#382)
Deprecated
- Deprecated
Context.originalArgv
. It will now always return an empty list. If your commands need an argv, you can pass it to them before you run them, or set in on the newContext.data
map. - Deprecated
Context.expandArgumentFiles
. UseContext.argumentFileReader
instead. - Renamed the following
Context
fields to be more consistent. The old names are deprecated.
old name | new name |
---|---|
Context.envvarReader |
Context.readEnvvar |
Context.correctionSuggestor |
Context.suggestTypoCorrection |
Context.argumentFileReader |
Context.readArgumentFile |
Context.tokenTransformer |
Context.transformToken |
Removed
- Removed previously deprecated experimental annotations.
- Removed
MordantHelpFormatter.graphemeLength
- Removed
TermUi