DeclarativeCommandLine.Generator 2.0.4

There is a newer version of this package available.
See the version list below for details.
dotnet add package DeclarativeCommandLine.Generator --version 2.0.4
                    
NuGet\Install-Package DeclarativeCommandLine.Generator -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.Generator" Version="2.0.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine.Generator" Version="2.0.4" />
                    
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.4
                    
#r "nuget: DeclarativeCommandLine.Generator, 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.Generator@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.Generator&version=2.0.4
                    
Install as a Cake Addin
#tool nuget:?package=DeclarativeCommandLine.Generator&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
There are no supported framework assets in this package.

Learn more about Target Frameworks and .NET Standard.

  • .NETStandard 2.0

    • No dependencies.

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 38 1/8/2026
2.0.9-g9e9a184db8 32 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 86 1/5/2026
2.0.6-g2f5f702623 80 1/5/2026
2.0.5 445 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 275 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 127 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 171 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 194 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 180 9/23/2025
2.0.0-g409835df06 207 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