Sharpify.CommandLineInterface
1.4.0
See the version list below for details.
dotnet add package Sharpify.CommandLineInterface --version 1.4.0
NuGet\Install-Package Sharpify.CommandLineInterface -Version 1.4.0
<PackageReference Include="Sharpify.CommandLineInterface" Version="1.4.0" />
<PackageVersion Include="Sharpify.CommandLineInterface" Version="1.4.0" />
<PackageReference Include="Sharpify.CommandLineInterface" />
paket add Sharpify.CommandLineInterface --version 1.4.0
#r "nuget: Sharpify.CommandLineInterface, 1.4.0"
#:package Sharpify.CommandLineInterface@1.4.0
#addin nuget:?package=Sharpify.CommandLineInterface&version=1.4.0
#tool nuget:?package=Sharpify.CommandLineInterface&version=1.4.0
CHANGELOG
Version 1.4.0
- Optimized
Parser:Splitnow rents a buffer the array pool by itself and returns aRentedBufferWriter<string>, this enables greater flexibility in usage, and simplifies the code.- Changed lower level array allocation code to use generalized api to optimize on more platforms.
Arguments.TryGetValueandArguments.TryGetValuesnow have overloads that accept aReadOnlySpan<string> keys, this overload enables much simpler retrieval of parameters that have aliases, for example you might want something like--nameand-nto map to the same value.- If you specify the aliases using the collections expression (i.e
["one", "two"]), since .NET 8, the compiler will generate an inline array for that, which is very efficient, you don't need to create an array yourself. but if you wanted to to you could for example create astatic readonly ReadOnlySpan<string> aliases => new[] { "one", "two" };and pass that instead, the compiler optimizes such case by writing the values directly in the assembly.
- If you specify the aliases using the collections expression (i.e
CliBuildernow has an option to configure arguments case sensitivity usingConfigureArgumentsCaseHandling, by default arguments are case insensitive to prioritize user experience. however, if you want to have parameters that are case sensitive, for instances where you need more short flags likegrepyou can opt in for this feature by setting it to be case sensitive.CliBuildercan now configure how to handle empty inputs withConfigureEmptyInputBehavior, by default it will display the help text and exit, but you can configure it to attempt to proceed with handling the commands, if a single command is used and command name is set to not required, this will execute the command with empty args, otherwise it will display the appropriate error message.- This is a change in behavior, as previously by default an error showing that no command was found was displayed, but seems that showing the help text in those situations is the more common approach in modern CLIs.
- Updated parsing to detect cases where arguments start with
-and are not names of arguments, for example if you required a positional argument of typeintand the input was a negative number (also starts with-), it would've been interpreted as a named argument, now it will be correctly interpreted as a positional argument.- The rule now also checks if the first character following a
-is a digit, if it is, it will not be marked as named argument. Which means - don't use argument names that start with digits (this is a bad practice in general).
- The rule now also checks if the first character following a
- Help text no contains a special case for "version" and "--version" that will just display the version from metadata.
- Help text (from main) now has specialized structure for cases where you only have one command, instead of printing commands and descriptions, it will print the single command usage - the rest will of the whole cli (metadata)
- To support
--versionand add more customization options, nowMetadataandCustomHeaderare independent, and you can configure which is used for help text withSetHelpTextSource(HelpTextSource).Metadatawill be used by default. - The help text portion that used to display instruction to get help text is now shorter and more concise.
Argumentsnow has overload to directly get the values that correspond toTryGetValueoverloads with default values, since defaults values can be returned if no key was found or failed to be parsed, In some case the actual reason is not important and only the value is needed so we now haveGetValuefor this exact reason.
Usage Note
In case you are writing a cli which has a complex tree to navigate on the way to the execution, such as nested commands, and any single command processing gets verbose, remember that it is possible to create a CliRunner at any point.
This means that you can create objects for the nested commands, inside the top level command you could then forward the positional arguments (or not) if you choose, then use the same builder pattern with CliRunner.CreateBuilder()... and add the nested commands, then execute using the already parsed Arguments object as the CliRunner.RunAsync also has an overload that accepts Arguments.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Sharpify (>= 2.4.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.0.0 | 411 | 11/18/2025 |
| 2.0.0 | 208 | 7/15/2025 |
| 1.5.0 | 391 | 11/13/2024 |
| 1.4.0 | 3,674 | 10/21/2024 |
| 1.4.0-Alpha | 137 | 10/10/2024 |
| 1.3.0 | 148 | 7/26/2024 |
| 1.2.2 | 176 | 7/3/2024 |
| 1.2.1 | 173 | 6/4/2024 |
| 1.2.0 | 198 | 3/13/2024 |
| 1.1.0 | 189 | 1/25/2024 |
| 1.0.5 | 192 | 1/22/2024 |
| 1.0.4 | 177 | 1/20/2024 |
| 1.0.3 | 168 | 1/20/2024 |
| 1.0.1 | 191 | 1/15/2024 |
| 1.0.0 | 179 | 1/15/2024 |