System.CommandLine v2.0.0-beta1.21216.1
Pre-releaseWhat's new
It's been a while since our last beta release because as we approach the 2.0 milestone, we're making more breaking changes, and we're trying to group them into fewer releases in order to minimize churn.
System.CommandLine
-
Added an
Argument.LegalFileNamesOnlyextension method to improve file validations. (Thanks, @AronParker !) -
Made significant improvements to
HelpBuilderto enable more fine-grained customization of help output. (Thanks, @Keboo!) -
Added an optional
descriptionparameter to anArgument<T>constructor to matchOption<T>. (Thanks, @database64128!) -
CommandHandler.Createcan now specify abstract methods, which can vary by the derived class at invocation time. (Thanks, @ycrumeyrolle!) -
Improved support for POSIX bundled arguments when no delimiter is used. (Thanks, @sfoslund)
-
Ahora se puede localizar la ayuda (pero todavia se necesita marcar
-hpara pedirla 🤔). (Thanks, @Keboo!) -
Added XML documentation for a number of types. (Thanks, @pieter-venter!)
-
Added a
ParseResultparameter toSymbol.GetSuggestionsand to the signature forSuggestDelegate. TheGetSuggestionschange is not a source-breaking change because we've also added an extension method supporting the older signature. (Thanks, @thoemmi!) -
Fixed a bug where trailing spaces would break response file parsing. (Thanks, @hackf5!)
-
Introduced
IIdentifierSymbol, whichOptionandCommandimplement, butArgumentdoes not. -
Enabled customization of exit codes on error by passing an
exitErrorCodeargument to variousCommandLineBuildermethods:UseExceptionHandler,UseParseDirective,UseParseErrorReporting, andUseVersionOption. (Thanks, @Keboo!) -
Custom argument parsers using
ParseArgument<T>can now partially consume tokens usingArgumentResult.OnlyTake(int), allowing other symbols to consume the remaining tokens. -
CommandHandler.Createnow provides overloads for up to 16 parameters. We used to go to 11, but it wasn't enough. -
The debug directive now requires opt-in from the user, in order to prevent it from being used maliciously to block a process. (Thanks, @Keboo!)
-
Numerous performance improvements, benefitting speed and memory footprint. (Thanks, @paulomorgado!) Here's a sample:
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042 Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores .NET Core SDK=5.0.300-preview.21180.15 [Host] : .NET Core 5.0.5 (CoreCLR 5.0.521.16609, CoreFX 5.0.521.16609), X64 RyuJIT MediumRun : .NET Core 5.0.5 (CoreCLR 5.0.521.16609, CoreFX 5.0.521.16609), X64 RyuJIT Job=MediumRun Force=True IterationCount=15 LaunchCount=2 RunStrategy=ColdStart WarmupCount=10
Method NuGetReferences Mean Error StdDev Median Ratio RatioSD Gen 0 Gen 1 Gen 2 Allocated SimpleParseAndInvoke System.CommandLine 2.0.0-beta1.20371.2 21.89 ms 59.16 ms 88.54 ms 1.0039 ms 1.00 0.00 - - - 52.84 KB SimpleParseAndInvoke System.CommandLine 2.0.0-beta1.21214.1 17.16 ms 49.76 ms 74.48 ms 0.7997 ms 0.83 0.18 - - - 45.48 KB -
Various bug fixes.
System.CommandLine.Hosting
- Added
IHostBuilder.GetInvocationContextextension methods for accessingInvocationContextin order to do invocation-specific dependency injection and more. (Thanks, @fredrikhr!)
Breaking changes
-
Option.Argumenthas been removed from the public API.Option/Option<T>constructors have been adjusted so that functionality for option arguments (such as setting default values and custom argument parsers) is available viaOptionandOption<T>. -
Model binding no longer passes
nullfor unspecified argument and option values ofIEnumerableorstringtypes. Instead, it passes an empty array or list of the appropriate type, orstring.Empty, respectively. -
SuggestDelegatenow takes aParseResultparameter in addition to the existingstring textToMatchparameter. -
InvocationContext.ResultCodehas been renamed toInvocationContext.ExitCode. -
The following string-based lookup APIs have been removed because they can be ambiguous when more than one symbol matches:
ParseResult[string]CommandResult.OptionResult(string)CommandResult[string]
-
System.CommandLine.Invocation.Processhas been removed from the public API.