DeclarativeCommandLine.Generator 2.0.9

dotnet add package DeclarativeCommandLine.Generator --version 2.0.9
                    
NuGet\Install-Package DeclarativeCommandLine.Generator -Version 2.0.9
                    
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.Generator" Version="2.0.9" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine.Generator" Version="2.0.9" />
                    
Directory.Packages.props
<PackageReference Include="DeclarativeCommandLine.Generator" />
                    
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.Generator --version 2.0.9
                    
#r "nuget: DeclarativeCommandLine.Generator, 2.0.9"
                    
#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.Generator@2.0.9
                    
#: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.Generator&version=2.0.9
                    
Install as a Cake Addin
#tool nuget:?package=DeclarativeCommandLine.Generator&version=2.0.9
                    
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

2 packages are needed:

<ItemGroup>
  <PackageReference Include="DeclarativeCommandLine" Version="2.0.4" />
  <PackageReference Include="DeclarativeCommandLine.Generator" Version="2.0.4" />
  <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
  • Aliases
  • Arguments
  • Description
  • Hidden
  • Name
  • Options
  • Subcommands
  • Completions
  • TreatUnmatchedTokensAsErrors
  • Validators

Arguments

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

Directives

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

Option

  • opt.AcceptOnlyFromAmong
  • opt.Aliases
  • opt.DefaultValueFactory
  • opt.Description
  • opt.Hidden
  • opt.Name
  • opt.Required
  • opt.AcceptLegalFileNamesOnly
  • opt.AcceptLegalFilePathsOnly
  • opt.AllowMultipleArgumentsPerToken
  • opt.Arity
  • opt.Completions
  • opt.HelpName
  • opt.Recursive
  • opt.Validators
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

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
2.0.9 32 1/8/2026
2.0.9-g9e9a184db8 29 1/8/2026
2.0.8 61 1/7/2026
2.0.8-gfc22e4cb06 64 1/7/2026
2.0.8-g9e463e3b3d 70 1/6/2026
2.0.8-g0ad8ce0a04 66 1/7/2026
2.0.7 75 1/6/2026
2.0.7-ga053346dae 68 1/6/2026
2.0.7-g45ae65d897 73 1/6/2026
2.0.6 85 1/5/2026
2.0.6-g2f5f702623 80 1/5/2026
2.0.5 444 11/11/2025
2.0.5-gea1e4ae1df 272 11/13/2025
2.0.5-ge6c7c87265 424 12/9/2025
2.0.5-gd8cf18ea7c 392 11/19/2025
2.0.5-ga96eae29db 229 12/15/2025
2.0.5-ga1c501d4da 275 11/12/2025
2.0.5-g8e2fac570b 197 11/9/2025
2.0.5-g8b12b86e90 269 11/11/2025
2.0.5-g88b4aecf18 173 11/25/2025
2.0.5-g8550c66d36 178 11/25/2025
2.0.5-g820069a1a5 224 12/15/2025
2.0.5-g610ddeca77 670 12/1/2025
2.0.5-g4598336118 82 1/4/2026
2.0.5-g3a45d269f8 274 11/11/2025
2.0.5-g35b7f5f92f 165 12/25/2025
2.0.4 186 11/1/2025
2.0.4-gb4cf6347cf 128 11/1/2025
2.0.4-g451b2d9552 120 11/1/2025
2.0.3 232 10/20/2025
2.0.3-geeb1c61699 169 10/20/2025
2.0.3-gcc6c4d69d1 180 10/29/2025
2.0.3-gc66b481f11 126 11/1/2025
2.0.3-ga9f6104077 125 11/1/2025
2.0.3-ga91f28fae6 178 10/27/2025
2.0.3-g9ab6cbd9b2 177 10/20/2025
2.0.3-g8dcdeb6c64 119 11/1/2025
2.0.3-g84e9b8e2eb 130 11/1/2025
2.0.3-g71218364b0 122 11/1/2025
2.0.3-g5a5b8e59d4 123 11/1/2025
2.0.3-g591863a1ad 132 11/1/2025
2.0.3-g4b9181987b 130 11/1/2025
2.0.3-g2f1c2590d3 169 10/19/2025
2.0.3-g08f8ed0a24 126 11/1/2025
2.0.2-gf66bfa5fb2 175 10/16/2025
2.0.2-gd3756f7444 169 10/6/2025
2.0.1-ge9dcc09990 176 9/23/2025
2.0.1-gdc08a8e864 178 9/23/2025
2.0.1-gc766f67b57 176 9/23/2025
2.0.1-g46d6bf17ab 170 9/23/2025
2.0.1-g2d66c9ebfb 170 9/23/2025
2.0.1-g08fe98beb7 178 9/30/2025
2.0.0-gea62d61c76 169 9/23/2025
2.0.0-gde3a002bb3 193 9/22/2025
2.0.0-gc2dbf534be 173 9/23/2025
2.0.0-gb9f9149db0 172 9/21/2025
2.0.0-gb85974762d 172 9/23/2025
2.0.0-gb6fbe1d722 186 9/22/2025
2.0.0-g498c5dd86c 179 9/23/2025
2.0.0-g409835df06 206 9/21/2025
2.0.0-g405b7ebebe 177 9/20/2025
2.0.0-g29ba6a745e 180 9/23/2025

2.0.0 Refactor to use a source generator
1.0.0 Initial release