DeclarativeCommandLine 2.0.4

There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package DeclarativeCommandLine --version 2.0.4
                    
NuGet\Install-Package DeclarativeCommandLine -Version 2.0.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DeclarativeCommandLine" Version="2.0.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine" Version="2.0.4" />
                    
Directory.Packages.props
<PackageReference Include="DeclarativeCommandLine" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DeclarativeCommandLine --version 2.0.4
                    
#r "nuget: DeclarativeCommandLine, 2.0.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DeclarativeCommandLine@2.0.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DeclarativeCommandLine&version=2.0.4
                    
Install as a Cake Addin
#tool nuget:?package=DeclarativeCommandLine&version=2.0.4
                    
Install as a Cake Tool

Declarative Command Line

WTQ CI

Nuget

Attribute-driven layer on top of System.CommandLine to make the most common use cases easier to set up.

Minimalistic Example

A minimal example, using DI to instantiate command objects:

Add NuGet Packages

<ItemGroup>
  <PackageReference Include="DeclarativeCommandLine" Version="2.0.3" />
  <PackageReference Include="DeclarativeCommandLine.Generator" Version="2.0.3" />
  <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.9"/>
</ItemGroup>

Program.cs

using DeclarativeCommandLine;
using Microsoft.Extensions.DependencyInjection;

namespace MyApp;

[Command(Description = "Math commands")]
public class AppRootCommand
{
}

[Command(Description = "Add 2 numbers", Parent = typeof(AppRootCommand))]
public class AddCommand : ICommand
{
    [Option(Required = true)]
    public int ValueA { get; set; }

    [Option(Required = true)]
    public int ValueB { get; set; }

    public void Execute()
    {
        Console.WriteLine($"A={ValueA} + {ValueB} = {ValueA + ValueB}");
    }
}

public static class Program
{
    public static int Main(string[] args)
    {
        var p = new ServiceCollection()
            .AddTransient<AppRootCommand>()
            .AddTransient<AddCommand>()
            .BuildServiceProvider();

        return new CommandBuilder()
            .Build(t => p.GetRequiredService(t))
            .Parse(args)
            .Invoke();
    }
}

Result

$ ./myapp
Required command was not provided.

Description:

Usage:
  myapp [command] [options]

Options:
  -?, -h, --help  Show help and usage information
  --version       Show version information

Commands:
  add
$ ./myapp add
Option '--value-a' is required.
Option '--value-b' is required.

Description:

Usage:
  myapp add [options]

Options:
  --value-a <value-a> (REQUIRED)
  --value-b <value-b> (REQUIRED)
  -?, -h, --help                  Show help and usage information
$ ./myapp add --value-a 20 --value-b 22
A=20 + 22 = 42

Generated

This is what the source generator has written, based on the attribute-annotated classes:

/// <auto-generated/>
using DeclarativeCommandLine;
using System;
using System.CommandLine;

namespace MyApp
{
    public partial class CommandBuilder
    {
        public virtual RootCommand Build(Func<Type, object> serviceProvider)
        {
            var cmd1 = new RootCommand();
            cmd1.Hidden = false;
            // global::MyApp.AddCommand
            {
                var cmd2 = new Command("add");
                cmd1.Add(cmd2);
                cmd2.Hidden = false;
                // Option --value-a
                var opt3 = new Option<Int32>("--value-a");
                {
                    cmd2.Add(opt3);
                    opt3.Description = "";
                    opt3.Hidden = false;
                    opt3.Required = true;
                }
                // Option --value-b
                var opt4 = new Option<Int32>("--value-b");
                {
                    cmd2.Add(opt4);
                    opt4.Description = "";
                    opt4.Hidden = false;
                    opt4.Required = true;
                }
                cmd2.SetAction(async (parseResult, ct) =>
                {
                    var cmd2Inst = (global::MyApp.AddCommand)serviceProvider(typeof(global::MyApp.AddCommand));
                    cmd2Inst.ValueA = parseResult.GetValue(opt3);
                    cmd2Inst.ValueB = parseResult.GetValue(opt4);

                    if (cmd2Inst is IAsyncCommandWithParseResult cmd2001)
                    {
                        await cmd2001.ExecuteAsync(parseResult, ct).ConfigureAwait(false);
                    }
                
                    if (cmd2Inst is IAsyncCommand cmd2002)
                    {
                        await cmd2002.ExecuteAsync(ct).ConfigureAwait(false);
                    }
                
                    if (cmd2Inst is ICommand cmd2003)
                    {
                        cmd2003.Execute();
                    }
                });

            }
            return cmd1;
        }
    }
}

Progress

Command

  • Action
  • Arguments
  • Description
  • Hidden
  • Name
  • Options
  • Subcommands
  • Aliases
  • Completions
  • TreatUnmatchedTokensAsErrors
  • Validators

Arguments

  • Description
  • Name
  • AcceptLegalFileNamesOnly
  • AcceptLegalFilePathsOnly
  • AcceptOnlyFromAmong
  • Arity
  • Completions
  • Default
  • HelpName
  • Hidden
  • Validators

Directives

  • dir.Description
  • dir.Hidden
  • dir.Name

Option

  • opt.Description
  • opt.Name
  • opt.Required
  • opt.AcceptLegalFileNamesOnly
  • opt.AcceptLegalFilePathsOnly
  • opt.AcceptOnlyFromAmong
  • opt.Aliases
  • opt.AllowMultipleArgumentsPerToken
  • opt.Arity
  • opt.Completions
  • opt.DefaultValueFactory
  • opt.HelpName
  • opt.Hidden
  • opt.Recursive
  • opt.Validators
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on DeclarativeCommandLine:

Repository Stars
flyingpie/windows-terminal-quake
Enable Quake-style dropdown for (almost) any application.
Version Downloads Last Updated
2.0.5-g8e2fac570b 32 11/9/2025
2.0.4 96 11/1/2025
2.0.4-gb4cf6347cf 63 11/1/2025
2.0.4-g451b2d9552 63 11/1/2025
2.0.3 177 10/20/2025
2.0.3-geeb1c61699 114 10/20/2025
2.0.3-gcc6c4d69d1 131 10/29/2025
2.0.3-gc66b481f11 72 11/1/2025
2.0.3-ga9f6104077 68 11/1/2025
2.0.3-ga91f28fae6 121 10/27/2025
2.0.3-g9ab6cbd9b2 114 10/20/2025
2.0.3-g8dcdeb6c64 60 11/1/2025
2.0.3-g84e9b8e2eb 62 11/1/2025
2.0.3-g71218364b0 69 11/1/2025
2.0.3-g5a5b8e59d4 62 11/1/2025
2.0.3-g591863a1ad 65 11/1/2025
2.0.3-g4b9181987b 65 11/1/2025
2.0.3-g2f1c2590d3 117 10/19/2025
2.0.3-g08f8ed0a24 65 11/1/2025
2.0.2-gf66bfa5fb2 112 10/16/2025
2.0.2-gd3756f7444 120 10/6/2025
2.0.1-ge9dcc09990 123 9/23/2025
2.0.1-gdc08a8e864 122 9/23/2025
2.0.1-gc766f67b57 119 9/23/2025
2.0.1-g46d6bf17ab 126 9/23/2025
2.0.1-g2d66c9ebfb 121 9/23/2025
2.0.1-g08fe98beb7 120 9/30/2025
2.0.0-gea62d61c76 120 9/23/2025
2.0.0-gde3a002bb3 133 9/22/2025
2.0.0-gc2dbf534be 117 9/23/2025
2.0.0-gb9f9149db0 113 9/21/2025
2.0.0-gb85974762d 118 9/23/2025
2.0.0-gb6fbe1d722 135 9/22/2025
2.0.0-g498c5dd86c 127 9/23/2025
2.0.0-g409835df06 147 9/21/2025
2.0.0-g405b7ebebe 131 9/20/2025
2.0.0-g29ba6a745e 121 9/23/2025
1.1.0-master-2025-06-13-1435 331 6/13/2025
1.0.1-master-2025-01-02-2241 85 1/2/2025
1.0.1-master-2024-12-18-2355 78 12/18/2024
1.0.0 781 12/18/2024
1.0.0-master-2024-12-18-2336 73 12/18/2024
1.0.0-master-2024-12-18-2320 78 12/18/2024
1.0.0-master-02150034 220 2/15/2023
1.0.0-master-02061124 302 2/6/2023
1.0.0-master-02040018 180 2/3/2023
1.0.0-master-02032358 178 2/3/2023
1.0.0-master-02032349 176 2/3/2023
1.0.0-master-02032327 182 2/3/2023
1.0.0-master-02032211 188 2/3/2023
1.0.0-build-3-202412111706 94 12/11/2024
1.0.0-build-3-202411281732 86 11/28/2024
1.0.0-build-1-02032055 187 2/3/2023

2.0.0 Refactor to use a source generator
1.0.0 Initial release