Releases: dotmake-build/command-line
DotMake.CommandLine v3.5.0
-
Added: Created
CliWriterclass which provides styled terminal output (color and text decoration),
using ANSI escape sequences when supported and console-native fallbacks otherwise.
CliContext.Output,CliContext.Error,HelpContext.Outputproperties will now return aCliWriter
instance so that user too can write styled output.
Also addedCli.OutputandCli.Errorproperties for global access.CliWriterclass currently provides these methods for styled output (on top of regularTextWritermethods):Write(CliStyle style, string value) Write(CliStyle style, string format, params object[] arg) WriteLine(CliStyle style, string value) WriteLine(CliStyle style, string format, params object[] arg) WriteLink(CliLink link, CliStyle style, string value) WriteLink(CliLink link, CliStyle style, string format, params object[] arg) WriteLink(CliLink link, string value) WriteLink(CliLink link, string format, params object[] arg) SetStyle(CliStyle style) ResetStyle()
More methods for writing common Success, Warning, Error messages with default styles are planned to be added in future versions.
For custom use, you can also get get a cached
CliWriterso that ANSI support detection is only done once perConsole.Out:var cliWriter = CliWriter.GetCached(Console.Out);
-
Improved:
CliThemenow uses new classCliStylefor its properties, which itself includesForeground,Background
andDecorationproperties.
Default themes from now on will not setForegroundorBackgroundforDefaultStyle(main color),
for exampleCliTheme.Defaultwill only useCliDecoration.BoldforFirstColumnStyleproperty instead of white color.
This is because detecting current terminal colors is impossible and for example on OSX terminal with dark mode,
text became invisible as we made assumptions (to fix color visibility) that on OSX terminal background color is usually white. -
Fixed:
An item with the same key has already been added.error whenCli.RunAsync()is called
in tests that re running in parallel (expecially with TUnit).
EnsuredArgumentConverter.RegisterStringConverter()andArgumentConverter.RegisterCollectionConverter()
useConcurrentDictionaryandGetOrAddfor preventing multi-thread racing problems.
DotMake.CommandLine v3.2.0
-
Improved: Updated to version
2.0.5of System.CommandLine. -
Added: Mutually exclusive option groups.
To declare that options are mutually exclusive, assign them the sameGroupin[CliOption]attributes:[CliCommand(Description = "Display different file formats")] public class FormatCommand { [CliOption(Group = "Format", Description = "Output as XML")] public bool Xml { get; set; } [CliOption(Group = "Format", Description = "Output as JSON")] public bool Json { get; set; } [CliOption(Description = "Verbosity level", Required = false)] public string Verbose { get; set; } public void Run(CliContext context) { context.ShowValues(); } }
Sometimes you want to enforce that exactly one option from a group must be specified.
This is done by setting theRequiredGroupsproperty in[CliCommand]attribute and listing the group names:[CliCommand(RequiredGroups = new[] { "auth" })] public class ReportCommand { // Group 1: Output format (mutually exclusive) [CliOption(Group = "output-format")] public bool Json { get; set; } [CliOption(Group = "output-format")] public bool Xml { get; set; } // Group 2: Authentication (required group) [CliOption(Group = "auth")] public string ApiKey { get; set; } [CliOption(Group = "auth")] public string Token { get; set; } public void Run(CliContext context) { context.ShowValues(); } }
-
Fixed: Localization did not work for inherited classes that existed in different files
due toSyntax node is not within syntax treeerror. -
Improved: Show full informational version like
2.0.0+b0f34d51fccc69fd334253924abd8d6853fad7aaand not
2.0.0when version is explicitly asked with-vor--versionoption. -
Fixed: Attempt to fix
CliNamer.AddTokenOrThrowname conflicting errors whenCli.Parse()is called
in tests that are running in parallel. Also ensure subcommand names and aliases are properly checked for conflicts.
DotMake.CommandLine v3.1.0
-
Improved: Added new class
CliRunnableResultwhich derives fromCliResultand addsRunandRunAsyncmethods
running the handler for the called command.
Changed return type ofCli.ParseandCliParser.Parsemethods fromCliResulttoCliRunnableResult
So now you can do:var result = Cli.Parse<RootCliCommand>(); return result.Run(); //or var parser = Cli.GetParser<RootCliCommand>(); var result = parser.Parse(args); return result.Run();
-
Changed: Deprecated
CliContext.IsEmptyCommand()andCliContext.IsEmpty(), use new properties
!CliContext.Result.HasArgsand!CliContext.Result.HasTokensinstead.
These are better suited to be inCliResultand naming should better clarify the purpose. -
Fixed:
QualifiedSyntaxRewriterto support fully qualify generic name syntax likeArray.Empty<CustomClass>().
Changed handling so thatIdentifierNameSyntaxanywhere is converted to fully qualified. -
Fixed: Calling
Cli.Ext.ConfigureServiceswill reset existing service provider if it was already built or set,
so that changed service collection can take effect:var result = Cli.Parse<IStartupOptions>(args); var startupOptions = result.Bind<IStartupOptions>(); //This works now, the existing service builder (caused by Cli.Parse) will be reset Cli.Ext.ConfigureServices(services => { services.AddSingleton(startupOptions); services.AddSingleton<Dependency>(); }); await Cli.RunAsync<RootCommand>(args);
DotMake.CommandLine v3.0.0
-
Improved: Updated to final version
2.0.0ofSystem.CommandLine. -
Improved: Remove
SourceRevisionId(commit id) fromAssemblyInformationalVersion(<InformationalVersion>)
so that displayed app version and result of--versioncommand is clean and concise.
For example displayMyApp v2.0.0instead ofMyApp v2.0.0+b0f34d51fccc69fd334253924abd8d6853fad7aa.
DotMake.CommandLine v2.8.2
-
Fixed: All types in generated code will now be prefixed with global namespace
global::to prevent
CS0234 errors (namespace and type conflict compile errors) which can happen when user names a namespace part and a class same.
Example code to replicate the problem (now fixed), note the.TestApp,.System,.DotMake
as the final part of the namespace which triggered the problem:using DotMake.CommandLine; //Generated code should not fail to compile even if user uses some crazy namespaces namespace TestApp.Commands.TestApp { [CliCommand] public class TestAppCliCommand { [CliArgument(Arity = CliArgumentArity.ZeroOrMore)] public string Arg { get; set; } } } namespace TestApp.Commands.System { [CliCommand] public class SystemCliCommand { } } namespace TestApp.Commands.DotMake { [CliCommand] public class DotMakeCliCommand { } }
-
Improved: Documentation for
CliContext.IsEmptyCommand()andCliContext.IsEmpty()to emphasize the difference.
DotMake.CommandLine v2.8.1
- Fixed: Help was no longer printed for subcommands with a required argument with v2.8.0.
This happened due to the update to2.0.0-rc.1.25451.107of System.CommandLine.
There is a new propertyClearsParseErrorsinSynchronousCommandLineAction
which from now on, should be overridden to returntruefor our custom actions likeCustomHelpActionandVersionOptionAction.
Normally ourCliHelpBuilderchecks forParseResult.Errors.Count > 0to avoid printing help when there is a parsing error.
So asClearsParseErrorswas not set totrue,CliHelpBuilderwas not printing help as it thought there was a parse error
i.e.Required argument missing for command, even though-?or-hwas passed.
DotMake.CommandLine v2.8.0
- Improved: Updated to version
2.0.0-rc.1.25451.107of System.CommandLine. - Added:
MaxWidthproperty toCustomHelpAction
and ensure correctmaxWidthparameter inCliHelpBuilderconstructor if not specified.
DotMake.CommandLine v2.7.1
- Fixed: Foreground color is always white on macOS regardless of theme settings.
DotMake.CommandLine v2.7.0
- Updated to version 2.0.0-beta7.25380.108 of System.CommandLine.
DotMake.CommandLine v2.6.8
-
Added:
CommandandRootCommandproperties toCliParserclass:var parser = Cli.GetParser<RootCliCommand>(); //Access the command that is used to parse the command line input. var command = parser.Command; //Access the root of the command that is used to parse the command line input. //If parser.Command is already a root command, this will be same instance. //If it's a sub-command, it will be the root of that sub-command. var rootCommand = parser.RootCommand;
-
Fixed: SourceGenerator sometimes triggers a concurrency exception. Use
ConcurrentDictionaryforGenerationCounts. -
Fixed: Do not add auto name or alias for root commands as it can unnecessarily conflict with children.