DeclarativeCommandLine.Generator 2.0.10

dotnet add package DeclarativeCommandLine.Generator --version 2.0.10
                    
NuGet\Install-Package DeclarativeCommandLine.Generator -Version 2.0.10
                    
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.10" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine.Generator" Version="2.0.10" />
                    
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.10
                    
#r "nuget: DeclarativeCommandLine.Generator, 2.0.10"
                    
#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.10
                    
#: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.10
                    
Install as a Cake Addin
#tool nuget:?package=DeclarativeCommandLine.Generator&version=2.0.10
                    
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.10 139 1/29/2026
2.0.10-gf94ac20f39 84 1/29/2026
2.0.10-gf2159b44ed 83 2/3/2026
2.0.10-g7ff6e5e0f6 34 2/19/2026
2.0.9 180 1/8/2026
2.0.9-geb2b5347ad 82 1/20/2026
2.0.9-g9e9a184db8 90 1/8/2026
2.0.9-g9ca013ae77 78 1/20/2026
2.0.9-g6b20a2e36c 84 1/20/2026
2.0.9-g5faf7a37a6 82 1/28/2026
2.0.9-g380f67a4e6 88 1/23/2026
2.0.8 95 1/7/2026
2.0.8-gfc22e4cb06 88 1/7/2026
2.0.8-g9e463e3b3d 83 1/6/2026
2.0.8-g0ad8ce0a04 90 1/7/2026
2.0.7 97 1/6/2026
2.0.7-ga053346dae 82 1/6/2026
2.0.7-g45ae65d897 90 1/6/2026
2.0.6 101 1/5/2026
2.0.6-g2f5f702623 88 1/5/2026
Loading failed

2.0.0 Refactor to use a source generator
1.0.0 Initial release