DeclarativeCommandLine 2.0.0-g405b7ebebe

This is a prerelease version of DeclarativeCommandLine.
There is a newer version of this package available.
See the version list below for details.
dotnet add package DeclarativeCommandLine --version 2.0.0-g405b7ebebe
                    
NuGet\Install-Package DeclarativeCommandLine -Version 2.0.0-g405b7ebebe
                    
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.0-g405b7ebebe" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine" Version="2.0.0-g405b7ebebe" />
                    
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.0-g405b7ebebe
                    
#r "nuget: DeclarativeCommandLine, 2.0.0-g405b7ebebe"
                    
#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.0-g405b7ebebe
                    
#: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.0-g405b7ebebe&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=DeclarativeCommandLine&version=2.0.0-g405b7ebebe&prerelease
                    
Install as a Cake Tool

Declarative Command Line

GitHub Actions

NuGet latest release

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

Minimalistic Example

The very smallest a command can be:

using DeclarativeCommandLine;

[Command]
public class AddNumbersCommand : ICommand
{
	[Option]
	public int NumberA { get; set; }

	[Option]
	public int NumberB { get; set; }

	public void Execute()
	{
		Console.WriteLine($"{NumberA} + {NumberB} = {NumberA + NumberB}");
	}
}

Contents

Commands

TODO:

  • Name
  • Aliases
  • Description
  • IsHidden
  • Parent
  • TreatUnmatchedTokensAsErrors
public class MyCommand
{

}

Arguments

[Command]
public class MyCommand
{
	[Argument]
	public string MyArgument { get; set; }
}

TODO:

  • Name
  • Description
  • DefaultValue
  • ArgumentArity Arity
  • Completions
  • FromAmong
  • HelpName
  • IsHidden
  • LegalFileNamesOnly
  • LegalFilePathsOnly

Options

[Command]
public class MyCommand
{
	[Option]
	public string MyOption { get; set; }
}

TODO:

  • Name
  • Aliases
  • DefaultValue
  • Description
  • ArgumentHelpName
  • AllowMultipleArgumentsPerToken
  • ArgumentArity Arity
  • Completions
  • FromAmong
  • IsRequired
  • IsGlobal
  • IsHidden
  • LegalFileNamesOnly
  • LegalFilePathsOnly

Command Handlers

TODO

[RootCommand]
public class AppRootCommand
{
	[CommandHandler]
	public void Handle()
	{
	}
}

Command Builders

TODO

[RootCommand]
public class AppRootCommand
{
	[CommandBuilder]
	public void Handle(System.CommandLine.Command command)
	{
	}
}

Command Inheritance

TODO

Dependency Injection

TODO

Root Command

Generally, an app has exactly 1 "root command", which handles the case where no explicit command is specified.

For example, with an argument:

my-app.exe C:/path/to/file.txt

With an option:

my-app.exe --verbose

Cases like these are handled through the root command. If no root command is defined, an empty default root command is used, to cut down on boilerplate.

But one can be defined explicitly, like this:

[RootCommand]
public class AppRootCommand
{
	[Argument]
	public string MyFirstArgument { get; set; }

	[Option]
	public bool Verbose { get; set; }
}

Command Hierarchy

Commands can be arranged in a hierarchy, to add structure and share arguments and options.

Here's a couple example commands that illustrate the concept.

my-app.exe file create my-file.txt
my-app.exe dir create my-dir

We could define the commands as:

[Command("file")]
public class FileCommand
{
}
[Command("create", Parent = typeof(FileCommand))]
public class CreateFileCommand
{
	[Argument]
	public string FileName { get; set; }

	[CommandHandler]
	public void Handle()
	{
		File.WriteAllText(FileName, string.Empty);
	}
}
[Command("dir")]
public class DirCommand
{
}
[Command("create", Parent = typeof(DirCommand))]
public class CreateDirCommand
{
	[Argument]
	public string DirName { get; set; }

	[CommandHandler]
	public void Handle()
	{
		Directory.CreateDirectory(DirName);
	}
}

We can now add more commands under these, for example:

[Command("current", Parent = typeof(DirCommand))]
public class CurrentDirCommand
{
	[CommandHandler]
	public void Handle()
	{
		Console.WriteLine($"CURRENT: {Directory.GetCurrentDirectory()}");
	}
}
my-app.exe dir current
CURRENT: C:\path\to\net6.0

Automatic Naming

TODO

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.10 107 1/29/2026
2.0.10-gf94ac20f39 89 1/29/2026
2.0.10-gf2159b44ed 30 2/3/2026
2.0.9 166 1/8/2026
2.0.9-geb2b5347ad 80 1/20/2026
2.0.9-g9e9a184db8 90 1/8/2026
2.0.9-g9ca013ae77 82 1/20/2026
2.0.9-g6b20a2e36c 85 1/20/2026
2.0.9-g5faf7a37a6 90 1/28/2026
2.0.9-g380f67a4e6 82 1/23/2026
2.0.8 100 1/7/2026
2.0.8-gfc22e4cb06 89 1/7/2026
2.0.8-g9e463e3b3d 88 1/6/2026
2.0.8-g0ad8ce0a04 93 1/7/2026
2.0.7 100 1/6/2026
2.0.7-ga053346dae 80 1/6/2026
2.0.7-g45ae65d897 83 1/6/2026
2.0.6 97 1/5/2026
2.0.6-g2f5f702623 88 1/5/2026
2.0.5 501 11/11/2025
2.0.5-gea1e4ae1df 289 11/13/2025
2.0.5-ge6c7c87265 436 12/9/2025
2.0.5-gd8cf18ea7c 404 11/19/2025
2.0.5-ga96eae29db 232 12/15/2025
2.0.5-ga1c501d4da 280 11/12/2025
2.0.5-g8e2fac570b 167 11/9/2025
2.0.5-g8b12b86e90 283 11/11/2025
2.0.5-g88b4aecf18 186 11/25/2025
2.0.5-g8550c66d36 189 11/25/2025
2.0.5-g820069a1a5 230 12/15/2025
2.0.5-g610ddeca77 667 12/1/2025
2.0.5-g4598336118 84 1/4/2026
2.0.5-g3a45d269f8 288 11/11/2025
2.0.5-g35b7f5f92f 189 12/25/2025
2.0.4 139 11/1/2025
2.0.4-gb4cf6347cf 91 11/1/2025
2.0.4-g451b2d9552 92 11/1/2025
2.0.3 207 10/20/2025
2.0.3-geeb1c61699 134 10/20/2025
2.0.3-gcc6c4d69d1 168 10/29/2025
2.0.3-gc66b481f11 101 11/1/2025
2.0.3-ga9f6104077 97 11/1/2025
2.0.3-ga91f28fae6 149 10/27/2025
2.0.3-g9ab6cbd9b2 144 10/20/2025
2.0.3-g8dcdeb6c64 89 11/1/2025
2.0.3-g84e9b8e2eb 95 11/1/2025
2.0.3-g71218364b0 98 11/1/2025
2.0.3-g5a5b8e59d4 88 11/1/2025
2.0.3-g591863a1ad 101 11/1/2025
2.0.3-g4b9181987b 100 11/1/2025
2.0.3-g2f1c2590d3 135 10/19/2025
2.0.3-g08f8ed0a24 94 11/1/2025
2.0.2-gf66bfa5fb2 140 10/16/2025
2.0.2-gd3756f7444 151 10/6/2025
2.0.1-ge9dcc09990 146 9/23/2025
2.0.1-gdc08a8e864 155 9/23/2025
2.0.1-gc766f67b57 141 9/23/2025
2.0.1-g46d6bf17ab 148 9/23/2025
2.0.1-g2d66c9ebfb 138 9/23/2025
2.0.1-g08fe98beb7 148 9/30/2025
2.0.0-gea62d61c76 146 9/23/2025
2.0.0-gde3a002bb3 154 9/22/2025
2.0.0-gc2dbf534be 142 9/23/2025
2.0.0-gb9f9149db0 140 9/21/2025
2.0.0-gb85974762d 142 9/23/2025
2.0.0-gb6fbe1d722 158 9/22/2025
2.0.0-g498c5dd86c 151 9/23/2025
2.0.0-g409835df06 171 9/21/2025
2.0.0-g405b7ebebe 156 9/20/2025
2.0.0-g29ba6a745e 144 9/23/2025
1.1.0-master-2025-06-13-1435 405 6/13/2025
1.0.1-master-2025-01-02-2241 106 1/2/2025
1.0.1-master-2024-12-18-2355 106 12/18/2024
1.0.0 914 12/18/2024
1.0.0-master-2024-12-18-2336 97 12/18/2024
1.0.0-master-2024-12-18-2320 97 12/18/2024
1.0.0-master-02150034 249 2/15/2023
1.0.0-master-02061124 334 2/6/2023
1.0.0-master-02040018 205 2/3/2023
1.0.0-master-02032358 209 2/3/2023
1.0.0-master-02032349 211 2/3/2023
1.0.0-master-02032327 212 2/3/2023
1.0.0-master-02032211 223 2/3/2023
1.0.0-build-3-202412111706 109 12/11/2024
1.0.0-build-3-202411281732 100 11/28/2024
1.0.0-build-1-02032055 219 2/3/2023

2.0.0 Refactor to use a source generator
1.0.0 Initial release